home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / comms / other / novia / src / novia_main.c < prev    next >
Text File  |  1999-12-06  |  103KB  |  4,129 lines

  1. /********************************************************************************************************************************
  2.  *                                                                                                                              *
  3.  * NOViA - Interactive Network Solutions                                                                                        *
  4.  *                                                                                                                              *
  5.  * MainServer                                                                                                                   *
  6.  *                                                                                                                              *
  7.  * Copyright (c) 1996,1997,1998,1999 Thorsten Gehler/UFoP                                                                       *
  8.  *                                                                                                                              *
  9.  * Release: Amiga            Server Software 0.01.03 beta                                                                       *
  10.  *          NetBSD 1.32      Server Software 0.00.01 alpha                                                                      *
  11.  *          Apple Macintosh  Client Software 0.00.00 alpha                                                                      *
  12.  *                                                                                                                              *
  13.  ********************************************************************************************************************************/
  14.  
  15. #include <pragma/gadtools_lib.h>
  16. #include <pragma/rexxsyslib_lib.h>
  17. #include <pragma/exec_lib.h>
  18. #include <pragma/dos_lib.h>
  19. #include <pragma/commodities_lib.h>
  20. #include <libraries/commodities.h>
  21. #include <clib/dos_protos.h>
  22. #include <pragma/intuition_lib.h>
  23. #include <pragma/graphics_lib.h>
  24. #include <utility/utility.h>
  25. #include <pragma/utility_lib.h>
  26. #include <exec/semaphores.h>
  27.  
  28. #include <devices/timer.h>
  29. #include <intuition/intuition.h>
  30. #include <novia/novia_gui.h>
  31. #include <novia/novia_global.h>
  32. #include <novia/novia_misc.h>
  33. #include <novia/novia_funcs.h>
  34.  
  35. #include <clib/alib_protos.h>
  36. #include <clib/muimaster_protos.h>
  37. #include <dos/dostags.h>
  38. #include <dos/stdio.h>
  39. #include <string.h>
  40. #include <pragma/noviasys_lib.h>
  41.  
  42. #include "novia_reg_data.h"
  43.  
  44. //#define DEBUG
  45.  
  46. #define NOVIA_VERSION "0.74"
  47.  
  48. char ver[]="$VER: NOVIA NETWARE (AMIGA) "NOVIA_VERSION" ("__DATE2__" "__TIME__"), copyright © 1996,1997,1998,1999 by Thorsten Gehler";
  49.  
  50. struct NewMenu mymenu[] =
  51. {
  52.     { NM_TITLE, "Project",            0,    0, 0, 0,},
  53.     {  NM_ITEM,        "About...",        "?",0, 0, 0,},
  54.     {  NM_ITEM,        NM_BARLABEL,    0,    0, 0, 0,},
  55.     {  NM_ITEM,        "Lock consule",    0,    0, 0, 0,},
  56.     {  NM_ITEM,        "Close window",    0,    0, 0, 0,},
  57.     {  NM_ITEM,        NM_BARLABEL,    0,    0, 7, 0,},
  58.     {  NM_ITEM,        "Restart BBS",    0,    0, 0, 0,},
  59.     {  NM_ITEM,        "Reset Server",    0,    0, 0, 0,},
  60.     {  NM_ITEM,        NM_BARLABEL,    0,    0, 0, 0,},
  61.     {  NM_ITEM,        "Quit",            "Q",0, 0, 0,},
  62.     { NM_TITLE, "Services",            0,    0, 0, 0,},
  63.     {  NM_ITEM,        "All Server off",    0,    CHECKIT | MENUTOGGLE | CHECKED, 0, 0,},
  64.     {  NM_ITEM,        "No answer",        0,    CHECKIT | MENUTOGGLE | CHECKED, 0, 0,},
  65.     {  NM_ITEM,        "Enter Sysop chat",    "c",    0, 0, 0,},
  66.     {  NM_ITEM,        "hanging up",    "h",    0, 0, 0,},
  67.     {   NM_END, NULL,                0,    0, 0, 0,}
  68. };
  69.  
  70. void c_FreeClientPort();
  71. struct PortData *CreateClient(PortData *cport);
  72. struct PortData *c_init();
  73. struct MsgPort *reminder_eventport=NULL;
  74. struct MsgPort *main_eventport=CreateMsgPort();
  75.  
  76. long GetCommandID(char *string);
  77. void SaveMainPortConfig( MainPortConfig *pointer);
  78. void CloseIt( char error_code, char *error_text);
  79. struct MainPortConfig *LoadMainPortConfig(MainPortConfig *pointer);
  80. LONG m_init();
  81. void m_StartPort();         // Prototype
  82. void c_StartPort();         // Prototype
  83. BOOL CloseClientPort(LONG PortID);
  84. BOOL SendGUIMsg(LONG msgid,APTR data);
  85. void ReturnGUIMsg(GUIMsg *msg);
  86. void FreeGUIMsg(GUIMsg *msg);
  87. void LoadClientList();
  88. void SaveClientList();
  89. struct PortData *NewClientPort();
  90. void SaveClientConfig( ClientConfig *cconfig);
  91.  
  92. void MyFreeVec( APTR address,  char *text);
  93. APTR MyAllocVec( ULONG size,  ULONG flags,  char *text);
  94. void LoadMCICodes(ULONG *numberofmci, struct mcicode *mcicmd);
  95. void LoadCommandList(Directory *cmddir);
  96. BOOL LoadMemberList(char *filename, List *ulist);
  97. BOOL SaveMemberList(char *filename, List *ulist);
  98. void RepairUserList( UserList *ulist);
  99. void LoadStringTable();
  100. void RemoveStringList();
  101. struct PortData *FindClient(ULONG PortID);
  102. void StartGUI();
  103. void nrc_start();
  104. void nfs_start();
  105. void LoadEvents();
  106. void SaveEvents();
  107. void LoadMailServers();
  108. void SaveMailServers();
  109. void mystrcpy(char *dest,char *src,ULONG length);
  110. void StartReminder();
  111. void reminder_main();
  112. ULONG CalcEvent(Event *event);
  113. void ExecuteEvent(Event *event);
  114. void SendOnlineMessage(PortData *cport);
  115. PortData *FindClient( ULONG PortID);
  116. PortData *FindClientByUser( ULONG UserID);
  117. void Writechar(char i);
  118. void CR();
  119. extern void LowLevelCommand_makefs();
  120.  
  121. extern BOOL OpenXPrWindow();
  122. extern void WaitConnect();
  123. extern void CloseXPrWindow();
  124. extern BOOL DoTransfer();
  125. extern void DoRexxMsg(RexxMsg *rexxmsg);
  126. extern void gui_main();
  127. extern void nfs_main();
  128.  
  129.  
  130. struct Library *nslib_LibOpen();
  131. struct Library *nslib_LibClose();
  132. struct Library *nslib_LibExpunge();
  133. struct Library *nslib_LibExtfunc();
  134. struct PortData *nslib_InitPort();
  135. struct PortData *nslib_ClosePort();
  136.  
  137.  
  138. extern void FreeNRCList();
  139. extern void LoadNRCList(List *);
  140. extern void EditNRCList(List *);
  141. extern void SaveNRCList(List *);
  142. extern void SaveNRC(struct Room *room);
  143. extern void LoadNRC(struct Room *room);
  144. extern void KillNRC(struct Room *room);
  145. extern void nrc_main();
  146. extern void OpenConference();
  147. extern ULONG searchstr(char *str1, char *str2);
  148. extern struct EventMessage *SendEventMsg(MsgPort *sendport, MsgPort *replyport, APTR data, ULONG msg_type);
  149. extern void RedrawEventList();
  150.  
  151. extern LONG LowLevelCommand_makefilesystem();
  152. extern LONG LowLevelCommand_makeroot();
  153. extern LONG LowLevelCommand_adddirectory(char *name);
  154. extern LONG LowLevelCommand_addlink(char *name);
  155. extern LONG LowLevelCommand_addcommand(char *name);
  156.  
  157. /**** LIBRARIES BASES ***/
  158.  
  159. struct Library *GadToolsBase    = NULL;
  160. struct RxsLib *RexxSysBase        = NULL;
  161. struct Library *TimerBase        = NULL;
  162. struct Library *NoviaSysBase    = NULL;
  163. struct Library *MUIMasterBase    = NULL;
  164. struct Library *UtilityBase    = NULL;
  165. struct Library    *CxBase            = NULL;
  166.  
  167. /*** MESSAGEPORT NAMES ***/
  168.  
  169. char *MainPortName                = "Novia_MainPort";
  170. char *MainGUIPortName            = "Novia_GUIMainPort";
  171. char *GUIPortName                    = "Novia_GUI_Frontend_Port";
  172.  
  173. char *Titel="NOVIA-Netware, Copyright © 1996-99 by Thorsten Gehler Version "NOVIA_VERSION" preview alpha";
  174.  
  175.  
  176. /*** PRIVATE LISTS ***/
  177.  
  178.  
  179. struct NRCServer *nrcserver=NULL;
  180.  
  181. struct List *lock_list            = NULL,                            // locked list
  182.                 *client_list        = NULL;
  183.  
  184. struct MsgPort *MainGUIPort    = CreateMsgPort();
  185. struct MsgPort *GUIPort            = NULL;
  186.  
  187. ULONG  numberofclients            = 0;
  188. struct MainPortConfig *mainportconfig = NULL;
  189. struct Task *MainTask            = FindTask(NULL);
  190.  
  191. struct GUIFrontend guifrontend;
  192. struct Task *GUITask                = NULL;
  193.  
  194. struct Date actualdate;
  195. struct NFSServer *nfsserver    = NULL;
  196.  
  197.  
  198. /*** COMMODITY ***/
  199.  
  200. struct MsgPort     *cxport        = NULL;
  201. CxObj                    *broker        = NULL;
  202.  
  203. #define PRIORITY_TOOL_TYPE            "CX_PRIORITY"
  204. #define POP_ON_START_TOOL_TYPE    "CX_POPUP"
  205. #define POPKEY_TOOL_TYPE            "CX_POPKEY"
  206. #define POP_KEY_ID     (86L)     /* pop up identifier             */
  207. #define POP_KEY_DEFAULT                "RALT SHIFT DEL"
  208.  
  209. #define COM_NAME                        "Novia"
  210. #define COM_TITLE                        "Novia V 0.06"
  211. #define COM_DESCR                        "NOViA Interactive Network Services"
  212.  
  213. struct NewBroker mynb = {
  214.    NB_VERSION,                        /* Library needs to know version */
  215.       COM_NAME,                          /* broker internal name          */
  216.    COM_TITLE,                         /* commodity title               */
  217.       COM_DESCR,                         /* description                   */
  218.    NBU_NOTIFY | NBU_UNIQUE,           /* We want to be the only broker */
  219.                                      /* with this name and we want to */
  220.                                      /* be notified of any attempts   */
  221.                                      /* to add a commodity with the   */
  222.                                      /* same name                     */
  223.    0,                                 /* flags                         */
  224.       0,                                 /* default priority              */
  225.    NULL,                              /* port, will fill in            */
  226.       0                               /* channel (reserved)            */
  227. };
  228.  
  229. /*** RUNTIME SEMAPHORE ***/
  230.  
  231. struct SignalSemaphore *rt_semaphore        = NULL;
  232. char                           *rt_semaphore_name = "Novia_RTOS_Semaphore";
  233.  
  234. /********************/
  235.  
  236. void main(int argc, char **argv)
  237. {
  238.     LONG returncode=m_init();
  239.     if (!returncode)
  240.         m_StartPort();
  241.     CloseIt(returncode,"");
  242. }
  243.  
  244. void c_main()
  245. {
  246.     struct PortData *cport=c_init();
  247.     if (cport)
  248.     {
  249.         while (!cport->ProgramClose)
  250.         {
  251.             SN_WaitConnect();
  252.             c_StartPort();
  253.         }
  254.     }
  255.     c_FreeClientPort();
  256.  
  257. }
  258.  
  259.  
  260. void wbmain()
  261. {
  262.     main(0,0);
  263. }
  264.  
  265. void mainwb()
  266. {
  267.     main(0,0);
  268. }
  269.  
  270.  
  271. LONG m_init()
  272. {
  273.     LONG returncode=NULL;
  274.     struct PortData *cport;
  275.     guifrontend.ProgramClose=0;
  276.     guifrontend.GUIOpen=0;
  277.     if ((cport = AllocVec(sizeof(PortData), MEMF_ANY | MEMF_CLEAR)))
  278.     {
  279.         BPTR mulder;
  280.         ULONG entrys;
  281.         ULONG counter;
  282.         struct GUIMsg *waitmsg;
  283.         BOOL quit=FALSE;
  284.         char buffer[200];
  285.     
  286.         MainTask->tc_UserData    = cport;
  287. //        cport->network.isopen    = TRUE;
  288.         cport->network.online    = TRUE;
  289. //        cport->network.can_read    = TRUE;
  290. //        cport->network.can_write= TRUE;
  291.  
  292.         CreateNoviaLibrary();
  293. //        NoviaSysBase = OpenLibrary("noviasys.library",0);
  294.         if (NoviaSysBase)
  295.         {
  296.             strcpy(cport->RexxPortName, "NOVIAREXX0");
  297.             strcpy(cport->TaskName, "novia_main");
  298.             cport->ConPort        = CreateMsgPort();
  299.             cport->MainPort    = CreateMsgPort();
  300.             cport->LocalPort    = cport->MainPort;
  301.             cport->rexxport    = CreateMsgPort();
  302.             cport->rtport        = CreateMsgPort();
  303.             cport->nfs_port    = CreateMsgPort();
  304.  
  305.             if (cport->MainPort && cport->ConPort && cport->rexxport && cport->rtport && cport->nfs_port)
  306.             {
  307.                 cport->MainPort->mp_Node.ln_Name    = MainPortName;
  308.                 cport->MainPort                        = cport->MainPort;
  309.                 AddPort(cport->MainPort);
  310.             }
  311.             else
  312.             {
  313.                 printf("can't create MainPort.\n");
  314.                 returncode = 20;
  315.             }
  316.         }
  317.         else
  318.         {
  319.             printf("Can't create noviasys.library.\n");
  320.             returncode = 20;
  321.         }
  322.  
  323.  
  324.         if (!returncode)
  325.         {
  326.             if (cport->ConPort)
  327.             {
  328.                 cport->ConRead        = CreateIORequest(cport->ConPort, sizeof(IOStdReq));
  329.                 cport->ConWrite    = CreateIORequest(cport->ConPort, sizeof(IOStdReq));
  330.                 if (!cport->ConRead | !cport->ConWrite)
  331.                 {
  332.                     returncode = 20;
  333.                     printf("Can't create IORequest-structure for console.device\n");
  334.                 }
  335.             }
  336.             else
  337.             {
  338.                 printf("Can't create MSG-Port for console.device\n");
  339.                 returncode=20;
  340.             }
  341.         }
  342.         if (!returncode)
  343.         {
  344.             if ((cport->TimePort = CreateMsgPort()))
  345.             {
  346.                 if ((cport->TimerReq = CreateIORequest(cport->TimePort, sizeof(timerequest))))
  347.                     if (OpenDevice("timer.device", UNIT_VBLANK, (IORequest *)cport->TimerReq, 0))
  348.                     {
  349.                         printf("can't open timer.device.\n");
  350.                         returncode = 20;
  351.                     }
  352.                     else
  353.                     {
  354.                         TimerBase = (struct Library *)cport->TimerReq->tr_node.io_Device;
  355.                         if ((!cport->TimerReq)|(!TimerBase))
  356.                         {
  357.                             printf("can't open timer.device.\n");
  358.                             returncode = 20;
  359.                         }
  360.                     }
  361.             }
  362.             else
  363.             {
  364.                 printf("Can't create MSG-Port for timer.device\n");
  365.                 returncode=20;
  366.             }
  367.         }
  368.  
  369.         if (!returncode)
  370.         {
  371.             if (!(GadToolsBase = OpenLibrary("gadtools.library", 37)))
  372.             {
  373.                 printf("Can't open gadtools.library.\n");
  374.                 returncode = 20;
  375.             }
  376.         }
  377.  
  378.         if (!returncode)
  379.         {
  380.             if (!(RexxSysBase = (RxsLib *)OpenLibrary(RXSNAME, 0)))
  381.             {
  382.                 printf("Can't open rexxsyslib.library.\n");
  383.                 returncode = 20;
  384.             }
  385.         }
  386.  
  387.         if (!returncode)
  388.         {
  389.             if (!(UtilityBase = OpenLibrary("utility.library",37)))
  390.             {
  391.                 printf("Can't open utility.library.\n");
  392.                 returncode = 20;
  393.             }
  394.         }
  395.  
  396. #ifdef DEBUG
  397.         printf("start cx commodity\n");
  398.         Delay(200);
  399. #endif
  400.  
  401.         if (!returncode)
  402.         {
  403.            if ((CxBase = (struct Library *)OpenLibrary("commodities.library",5)))
  404.             {
  405.                if ((cxport = CreateMsgPort()))
  406.                 {
  407.                     mynb.nb_Flags |= COF_SHOW_HIDE;                                        // Enable SHOW/HIDE gadgets
  408.                     mynb.nb_Port    = cxport;
  409.                     if ((broker = CxBroker(&mynb, NULL)))                                // Attempt to create our broker
  410.                     {
  411.                         AttachCxObj(broker, HotKey(POP_KEY_DEFAULT, cxport,POP_KEY_ID));    // install a hotkey for popping up window. Setup all application specific commodities objects
  412. //                        if (error = CxObjError(broker))
  413.  
  414.                        ActivateCxObj(broker,1L);                                                // All went well so activate our broker
  415.                     }
  416.                 }
  417.             }
  418.         }
  419.  
  420. #ifdef DEBUG
  421.         printf("start title\n");
  422.         Delay(200);
  423. #endif
  424.  
  425.         if (!returncode)
  426.         {
  427.             cport->Titel = Titel;
  428. //            strcpy(cport->actitel, Titel);
  429.             if (!(cport->iobuffer = AllocVec(10000, MEMF_ANY | MEMF_CLEAR)))
  430.             {
  431.                 printf("can't alloc mem for iobuffer.\n");
  432.                 returncode = 20;
  433.             }    
  434.         }
  435.         MUIMasterBase = OpenLibrary(MUIMASTER_NAME,0);
  436.  
  437.         NewList((List *)&cport->iobuffer_list);
  438.         NewList((List *)&cport->his_list);
  439.         NewList((List *)&cport->select_list);
  440.         NewList((List *)&cport->downloadlist);
  441.         NewList((List *)&cport->rexxlist);
  442.         NewList((List *)&cport->itementrylist);
  443.  
  444. #ifdef DEBUG
  445.         printf("set program name\n");
  446.         Delay(200);
  447. #endif
  448.  
  449.         SetProgramName(cport->TaskName);
  450.  
  451.         if (!returncode)
  452.         {
  453.             if (!(client_list = AllocVec(sizeof(List), MEMF_ANY | MEMF_CLEAR)))
  454.             {
  455.                 printf("Can't create client_list.\n");
  456.                 returncode = 20;
  457.             }
  458.             else
  459.                 NewList(client_list);
  460.         }
  461.  
  462.         /************************************************************************/
  463.         /***                  starting graphics user interface                ***/
  464.         /************************************************************************/
  465.     
  466. #ifdef DEBUG
  467.         printf("check gui\n");
  468.         Delay(200);
  469. #endif
  470.  
  471.         if (!returncode)
  472.         {
  473.             if (MainGUIPort)
  474.             {
  475.                 MainGUIPort->mp_Node.ln_Pri    = 0;
  476.                 MainGUIPort->mp_Node.ln_Name    = MainGUIPortName;
  477.                 AddPort(MainGUIPort);
  478.             }
  479.             else
  480.             {
  481.                 returncode = 20;
  482.                 printf("Can't create MainGUIPort.\n");
  483.             }
  484.         }
  485.  
  486. #ifdef DEBUG
  487.         printf("mainportconfig\n");
  488.         Delay(200);
  489. #endif
  490.  
  491.         if (!returncode)
  492.         {
  493.             if (!(mainportconfig = AllocVec(sizeof(MainPortConfig), MEMF_ANY | MEMF_CLEAR)))
  494.             {
  495.                 printf("Can't create MainPortConfig-structure.\n");
  496.                 returncode=20;
  497.             }
  498.             else
  499.             {
  500.  
  501.                 #ifdef DEBUG
  502.                     printf("load mainportconfig\n");
  503.                     Delay(200);
  504.                 #endif
  505.                 if (LoadMainPortConfig(mainportconfig))
  506.                 {
  507.                     cport->sysdirs                            = &mainportconfig->sysdirs;
  508.                     cport->clientconfig.ScreenModeID    = mainportconfig->ScreenMode;
  509.                     cport->clientconfig.UseWorkbench    = mainportconfig->CH_Main;
  510.                     cport->clientconfig.Colors            = mainportconfig->Colors;
  511.                 }
  512.                 else
  513.                 {
  514.                     if (MUIMasterBase)
  515.                     {
  516.                         struct RegApp *regapp=NULL;
  517.                         if ((regapp = CreateRegApp()))
  518.                         {
  519.                             {
  520.                                 BOOL    running = TRUE;
  521.                                 ULONG    signal;
  522.                                 ULONG    result=0;
  523.                                 char *buf=NULL;
  524.                                 while (running)
  525.                                 {
  526.                                     if ((result=DoMethod(regapp->App,MUIM_Application_Input,&signal)))
  527.                                     {
  528.                                         switch (result)
  529.                                         {
  530.                                             case MUIV_Application_ReturnID_Quit:    case REGID_SAVE:
  531.  
  532.                                                 get(regapp->STR_RegNumber,MUIA_String_Contents,(APTR)&buf);
  533.                                                 strncpy(mainportconfig->RegID,buf,20);
  534.  
  535.                                                 get(regapp->STR_Reg_Name,MUIA_String_Contents,(APTR)&buf);
  536.                                                 strncpy(mainportconfig->RegName,buf,21);
  537.  
  538.                                                 get(regapp->STR_Reg_Location,MUIA_String_Contents,(APTR)&buf);
  539.                                                 strncpy(mainportconfig->RegLocation,buf,81);
  540.  
  541.                                                 get(regapp->STR_Reg_Voicenumber,MUIA_String_Contents,(APTR)&buf);
  542.                                                 strncpy(mainportconfig->RegVoicenumber,buf,41);
  543.  
  544.                                                 get(regapp->STR_Reg_Modem,MUIA_String_Contents,(APTR)&buf);
  545.                                                 strncpy(mainportconfig->RegModem,buf,41);
  546.  
  547.                                                 get(regapp->STR_Reg_EMail,MUIA_String_Contents,(APTR)&buf);
  548.                                                 strncpy(mainportconfig->RegEMail,buf,25);
  549.  
  550.                                                 strcpy(mainportconfig->sysdirs.sysdir,"novia:");
  551.                                                 strcpy(mainportconfig->sysdirs.userdir,"novia:users/");
  552.                                                 strcpy(mainportconfig->sysdirs.sysdata,"novia:sysdata/");
  553.                                                 strcpy(mainportconfig->sysdirs.systext,"novia:systext/");
  554.                                                 strcpy(mainportconfig->sysdirs.newuser,"novia:newuser/");
  555.  
  556.                                                 mainportconfig->CH_Main=TRUE;
  557.                                                 mainportconfig->Colors=8;
  558.                                                 mainportconfig->LoadGUI=TRUE;
  559.  
  560.                                                 cport->clientconfig.UseWorkbench=TRUE;
  561.                                                 cport->clientconfig.Colors=8;
  562.  
  563.                                                 SaveMainPortConfig(mainportconfig);
  564.  
  565.                                                 running=FALSE;
  566.                                                 returncode=0;
  567.                                                 break;
  568.                                         }
  569.                                     }
  570.                                     if(running && signal) Wait(signal);
  571.                                 }
  572.                             }
  573.                             DisposeRegApp(regapp);
  574.                             /*
  575.                             strcpy(pointer->sysdirs.sysdir,"novia:");
  576.                             strcpy(pointer->sysdirs.userdir,"novia:users/");
  577.                             strcpy(pointer->sysdirs.sysdata,"novia:sysdata/");
  578.                             strcpy(pointer->sysdirs.systext,"novia:systext/");
  579.                             strcpy(pointer->sysdirs.newuser,"novia:newuser/");
  580.                             */
  581.                         }
  582.                         else
  583.                         {
  584.                             printf("Can't create registration application.\n");
  585.                             returncode=20;
  586.                         }
  587.                     }
  588.                     else
  589.                     {
  590.                         printf("Can't open muimaster.library.\n");
  591.                         returncode=20;
  592.                     }
  593.                 }
  594.                 mainportconfig->rexxtempcounter    = 0;
  595.             }
  596.         }
  597.         /************************************************************************/
  598.     
  599.         if (!returncode)
  600.         {
  601.             cport->mymenu            = mymenu;
  602.             cport->Supervisor        = TRUE;
  603.             cport->NewUser            = TRUE;
  604.             cport->Dumped            = FALSE;
  605.             cport->HideAll            = FALSE;
  606.             cport->MuffAll            = FALSE;
  607.             cport->MonitorAll        = FALSE;
  608.             cport->UL.UserEntrys    = 0;
  609.             cport->PortStatus        = PORT_STATUS_ONLINE;
  610.             cport->systemservice    = TRUE;
  611.  
  612. #ifdef DEBUG
  613.         printf("monitor_open\n");
  614.         Delay(200);
  615. #endif
  616.  
  617.             Monitor_open();
  618.  
  619. #ifdef DEBUG
  620.         printf("show welcome\n");
  621.         Delay(200);
  622. #endif
  623.  
  624.             ShowText("work:novia/systext/sys.novia.text");
  625.  
  626.             NewList((List *)&mainportconfig->EventList);
  627.             NewList((List *)&mainportconfig->LocalMailServerList);
  628.             NewList((List *)&mainportconfig->POP3ServerList);
  629.  
  630. #ifdef DEBUG
  631.         printf("nrc start\n");
  632.         Delay(200);
  633. #endif
  634.  
  635.             nfs_start();
  636.             ioprintf("starting Novia Mail Services");
  637.  
  638. #ifdef DEBUG
  639.         printf("Load Mail Server\n");
  640.         Delay(200);
  641. #endif
  642.  
  643.             LoadMailServers();
  644.             CR();ioprintf("Cc2donec7\n");
  645.             ioprintf("setting up Eventlist");
  646.  
  647. #ifdef DEBUG
  648.         printf("Load Events\n");
  649.         Delay(200);
  650. #endif
  651.  
  652.             LoadEvents();
  653.             CR();ioprintf("Cc2donec7\n");
  654.             ioprintf("setting up StringTable");
  655.  
  656. #ifdef DEBUG
  657.         printf("Load string table\n");
  658.         Delay(200);
  659. #endif
  660.  
  661.             LoadStringTable();
  662.             CR();ioprintf("Cc2donec7\n");
  663.  
  664. #ifdef DEBUG
  665.         printf("load user list\n");
  666.         Delay(200);
  667. #endif
  668.  
  669.             LoadUserList(&cport->UL);
  670.             if ((cport->cmddir = AllocVec(sizeof(Directory), MEMF_ANY | MEMF_CLEAR)))
  671.             {
  672.                 LoadCommandList(cport->cmddir);
  673.             }
  674.             LoadMCICodes(&mainportconfig->numberofmci, mainportconfig->mcicmd);
  675.             cport->mcicmd            = mainportconfig->mcicmd;
  676.             cport->numberofmci    = &mainportconfig->numberofmci;
  677.             ioprintf("looking for client settup.");
  678.             CR();ioprintf("Cc2donec7\n");
  679.  
  680. #ifdef DEBUG
  681.         printf("load client list\n");
  682.         Delay(200);
  683. #endif
  684.  
  685.             LoadClientList();
  686.         }
  687.  
  688.         if (!returncode)
  689.         {
  690.             if (cport->rexxport)
  691.             {
  692.                 cport->rexxport->mp_Node.ln_Pri    = 0;
  693.                 cport->rexxport->mp_Node.ln_Name    = cport->RexxPortName;
  694.                 AddPort(cport->rexxport);
  695.             }
  696.             else
  697.             {
  698.                 printf("can't create rexxport.\n");
  699.                 returncode=20;
  700.             }
  701.         }
  702.  
  703.         if (!returncode)
  704.         {
  705. //            ndos_loadselectlist((List *)&cport->select_list);
  706.             ioprintf("starting Novia Relay Chat Services");
  707. //            nrc_start();
  708.             CR();ioprintf("Cc2donec7\n");
  709.             if (mainportconfig->LoadGUI)
  710.             {
  711.                 ioprintf("starting Graphic User Interface\n");
  712.                 StartGUI();
  713.             }
  714.             if (main_eventport)
  715.             {
  716.  
  717. #ifdef DEBUG
  718.         printf("start reminder\n");
  719.         Delay(200);
  720. #endif
  721.                 ioprintf("start Reminder");
  722.                 StartReminder();
  723.                 CR();ioprintf("Cc2donec7\n");
  724.             }
  725.         }
  726.         if (!returncode)
  727.         {
  728.             if (!(cport->inputbuffer = AllocVec(256,MEMF_ANY|MEMF_CLEAR)))
  729.                 returncode = 20;
  730.         }
  731.         if (!returncode)
  732.         {
  733.             if ((rt_semaphore = AllocVec(sizeof(struct SignalSemaphore), MEMF_ANY | MEMF_CLEAR)))
  734.             {
  735.                 rt_semaphore->ss_Link.ln_Name = rt_semaphore_name;
  736.                 InitSemaphore(rt_semaphore);
  737.                 AddSemaphore(rt_semaphore);
  738.             }
  739.             else
  740.             {
  741.                 ioprintf("can't alloc mem for rt_semaphore\n");
  742.                 returncode = 20;
  743.             }
  744.         }
  745.     }
  746.     else
  747.     {
  748.         printf("Can't create PortData-Structure.\n");
  749.         returncode=20;
  750.     }
  751.     return returncode;
  752. }
  753.  
  754.  
  755. void CloseIt( char error_code, char *error_text)
  756. {
  757.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  758.     struct Task *reminder_task=NULL;
  759.     if (cport)
  760.     {
  761.         ULONG quit=FALSE;
  762.         struct PortData2 *nc=(PortData2 *)client_list->lh_Head;
  763.         while (nc->port_node.ln_Succ)
  764.         {
  765.             if (nc->port_address->PortStatus>0)
  766.             {
  767.                 ioprintf("c3closing Port: c7%d.\n",nc->port_address->clientconfig.IDNumber);
  768.                 SendMsg(nc->port_address->LocalPort,nc->port_address,0,MSG_PORT_CLOSE,0);
  769.                 nc->port_address->ProgramClose=TRUE;
  770.                 nc->port_address->network.online=FALSE;
  771.                 if (nc->port_address->task)
  772.                     Signal(nc->port_address->task,nc->port_address->task->tc_SigWait);
  773.             }
  774.             nc=(PortData2 *)nc->port_node.ln_Succ;
  775.         }
  776.  
  777.         while (!quit)
  778.         {
  779.             quit=TRUE;
  780.             nc=(PortData2 *)client_list->lh_Head;
  781.             while (nc->port_node.ln_Succ && quit)
  782.             {
  783.                 if (nc->port_address->PortStatus>0)
  784.                     quit=FALSE;
  785.                 nc=(PortData2 *)nc->port_node.ln_Succ;
  786.             }
  787.             Delay(5);
  788.         }
  789.  
  790.  
  791.  
  792.         if (guifrontend.GUIOpen && GUITask)
  793.         {
  794.             guifrontend.ProgramClose=TRUE;
  795.             Signal(GUITask,GUITask->tc_SigWait);
  796.             ioprintf("wait for closeing GUI Sig\n");
  797.             while (guifrontend.GUIOpen)
  798.             {
  799.                 Delay(5);
  800.             }
  801.         }
  802.  
  803.  
  804.         if (cport->currentdir)
  805.             nfs_support_closeroot(cport);
  806.  
  807.         if (main_eventport)
  808.         {
  809.             if ((reminder_task=FindTask("novia_reminder")))
  810.             {
  811.                 if (SendEventMsg(reminder_eventport,main_eventport,0,EVENTMSGTYPE_QUIT))
  812.                 {
  813.                     struct EventMessage *msg;
  814.                     quit=FALSE;
  815.                     while (!quit)
  816.                     {
  817.                         if ((msg=(EventMessage *)GetMsg(main_eventport)))
  818.                         {
  819.                             if (msg->msg_type==EVENTMSGTYPE_QUIT)
  820.                             {
  821.                                 quit=TRUE;
  822.                             }
  823.                             if (msg->msg.mn_ReplyPort==main_eventport)
  824.                             {
  825.                                 FreeVec(msg);
  826.                             }
  827.                         }
  828.                         Delay(5);
  829.                     }
  830.                     DeleteMsgPort(main_eventport);
  831.                 }
  832.             }
  833.             ioprintf("reminder closed.\n");
  834.         }
  835.  
  836.         if (nfsserver)
  837.         {
  838.             if (nfsserver->nfstask)
  839.             {
  840.                 nfsserver->CloseServer = TRUE;
  841.                 Signal(nfsserver->nfstask,nfsserver->nfstask->tc_SigWait);
  842.                 while(nfsserver)
  843.                     Delay(5);
  844.             }
  845.         }
  846.  
  847.         if (cport->inputbuffer)
  848.         {
  849.             FreeVec(cport->inputbuffer);
  850.             cport->inputbuffer = NULL;
  851.         }
  852.         if (nrcserver)        // Shutdown nrcserver
  853.         {
  854.             UWORD counter=0;
  855.             ioprintf("close nrc-server.\n");
  856.             nrcserver->ServerClose=TRUE;
  857.             Signal(nrcserver->nrctask,1<<nrcserver->controlport->mp_SigBit);
  858.             while (nrcserver)
  859.             {
  860.                 Delay(5);
  861.             }
  862.             ioprintf("nrc-server closed.\n");
  863.         }
  864.  
  865. //        ClearList((List *)&cport->select_list);
  866.         ClearList((List *)&cport->his_list);
  867.         ClearList((List *)&cport->iobuffer_list);
  868.  
  869.         if (cport->rexxport)
  870.         {
  871.             RemPort(cport->rexxport);
  872.             DeleteMsgPort(cport->rexxport);
  873.         }    
  874.  
  875.  
  876. //        c_FreeClientList();
  877.  
  878.         if (cport->mcicmd)FreeVec(cport->mcicmd);
  879.         *cport->numberofmci=0;
  880.         if (cport->cmddir)
  881.         {
  882.             CommandEntry *commandentry;
  883.             while (!IsListEmpty((List *)&cport->cmddir->entrylist))
  884.             {
  885.                 commandentry = (CommandEntry *)cport->cmddir->entrylist.mlh_Head;
  886.                 Remove((Node *)commandentry);
  887.                 FreeVec(commandentry);
  888.             }
  889.             FreeVec(cport->cmddir);
  890.         }
  891.  
  892.         if (cport->UL.UserEntrys && cport->UL.utable)
  893.         {
  894.             FreeVec(cport->UL.utable);
  895.             cport->UL.UserEntrys=0; cport->UL.utable=NULL;
  896.         }
  897.  
  898.         Monitor_close();
  899.  
  900.         if (MainGUIPort)
  901.         {
  902.             RemPort(MainGUIPort);
  903.             DeleteMsgPort(MainGUIPort);
  904.         }
  905.         
  906.         if (client_list)FreeVec(client_list);
  907.         if (cport->iobuffer)FreeVec(cport->iobuffer);
  908.         
  909.         if (RexxSysBase)CloseLibrary((Library *)RexxSysBase);
  910.         if (GadToolsBase)CloseLibrary((Library *)GadToolsBase);
  911.         if (MUIMasterBase)CloseLibrary((Library *)MUIMasterBase);
  912.         if (UtilityBase)CloseLibrary((Library *)UtilityBase);
  913.  
  914.         if (cport->TimerReq)
  915.         {
  916.             if (cport->TimerReq->tr_node.io_Device)
  917.                 CloseDevice((IORequest *)cport->TimerReq);
  918.             DeleteIORequest((IORequest *)cport->TimerReq);
  919.         }
  920.  
  921.         if (cport->TimePort)
  922.             DeleteMsgPort(cport->TimePort);
  923.  
  924.         if (cport->ConRead)DeleteIORequest((IORequest *)cport->ConRead);
  925.         if (cport->ConWrite)DeleteIORequest((IORequest *)cport->ConWrite);
  926.         if (cport->ConPort)DeleteMsgPort(cport->ConPort);
  927.         if (cport->MainPort)
  928.         {
  929.             RemPort(cport->MainPort);
  930.             DeleteMsgPort(cport->MainPort);
  931.         }
  932.         if (cport->rtport)
  933.             DeleteMsgPort(cport->rtport);
  934.         RemoveStringList();
  935.  
  936.         if (NoviaSysBase) RemoveNoviaLibrary(NoviaSysBase);
  937.         if (mainportconfig)FreeVec(mainportconfig);
  938.         if (cport->nfs_port) DeleteMsgPort(cport->nfs_port);
  939.         FreeVec(cport);
  940.  
  941.         if (broker)DeleteCxObjAll(broker);
  942.         if (cxport)DeleteMsgPort(cxport);
  943.  
  944.         MainTask->tc_UserData = NULL;
  945.  
  946.         if (rt_semaphore)
  947.         {
  948.             RemSemaphore(rt_semaphore);
  949.             FreeVec(rt_semaphore);
  950.         }
  951.     }
  952.     if (error_code)printf("FATAL ERROR: %s\n",error_text);
  953. //    Exit((int)error_code);
  954. }
  955.  
  956. void m_StartPort()
  957. {
  958.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  959.     char buffer[200];
  960.     char Quit=FALSE;
  961.     char Cancel=FALSE;
  962.     ULONG Usernummer = 1,
  963.             user2;
  964.     char counter=0;
  965.     ULONG ulong,cmdid;
  966.     BOOL nostdcmd;        // no standart command
  967.     struct PortData *cport2;
  968.     struct PortData2 *nc;
  969.     struct Room *room;
  970.     BPTR mulder;
  971.     Writeio("",-1);
  972.     sprintf(buffer,"%ssys.start.new",cport->sysdirs->systext);
  973.     ShowText(buffer);LF();
  974.     ioprintf(&ver[6]);LF();
  975.     ioprintf("Copyright (c)1996,1997,1998,1999 by Thorsten Gehler. All rights reserved.\n\n");
  976.     
  977.     ChangeScreenStatus("LOCKED");
  978.  
  979.     cport->LocalUser.Flag_supervisor=TRUE;
  980.     while (!Quit && counter<5 && !cport->ProgramClose && cport->network.online)
  981.     {
  982.         Writeio("Enter System Password :",-1);
  983.         Getstring(buffer,0,20,0,0);
  984.         Writeio("Enter         Encrypt :",-1);
  985.         ChangeScreenStatus("ONLINE");
  986.         Getstring(buffer,0,20,0,0);
  987.         {
  988.             struct ItemEntryBlock *ieb;
  989.             ioprintf("\nUpdating System Database... please wait.\n\n");
  990.             LoadUser(&cport->LocalUser,Usernummer);
  991.             if (ndos_openroot())
  992.                 ioprintf("root opened\n");
  993.             ndos_loadselectlist((List *)&cport->select_list);
  994. //            ndos_getlist();
  995.             sprintf(buffer,"%ssys.welcome.new",cport->sysdirs->systext);
  996.             ShowText(buffer);LF();
  997.             Quit = FALSE;
  998.             while (!Quit && !cport->ProgramClose && cport->network.online)
  999.             {
  1000.                 ioprintf("\nc3%d.%s> c7",cport->clientconfig.IDNumber,cport->currentdirname);
  1001.                 Getstring(cport->inputbuffer,0,80,BUFFERED,0);
  1002.                 GetArg(cport->inputbuffer);
  1003.                 if (strlen(cport->argstring[0]))
  1004.                 {
  1005.                     if ((ieb = ndos_get_ieb(cport->argstring[0])))
  1006.                     {
  1007.                         switch (ieb->ItemType)
  1008.                         {
  1009.                             case ITEMTYPE_SUBBOARD:
  1010.                                 ndos_changedir(ieb->filename);
  1011.                                 break;
  1012.                             case ITEMTYPE_MESSAGE:
  1013.                                 ndos_readmessage(ieb);
  1014.                                 break;
  1015.                             case ITEMTYPE_FILEARCHIV:
  1016.                                 ioprintf("%s: Unknown object type\n",cport->argstring[0]);
  1017.                                 break;
  1018.                             case ITEMTYPE_EMAIL:
  1019. //                                ioprintf("%s: Unknown object type\n",cport->argstring[0]);
  1020.                                 ioprintf("readmailboxerror: %d\n",ndos_readmailbox(ieb));
  1021.                                 break;
  1022.                             case ITEMTYPE_COMMAND:
  1023.                                 {
  1024.                                     ndos_execute(cport->argstring[0]);
  1025.                                 }
  1026.                                 break;
  1027.                         }
  1028.                     }
  1029.                     else
  1030.                     {
  1031.                         if (cport->inputbuffer[0] == '*')
  1032.                         {
  1033.                             ndos_tstselect(cport->inputbuffer);
  1034.                         }
  1035.                         else
  1036.                         {
  1037.                             if (*cport->argstring[0] == '/')
  1038.                             {
  1039.                                 char *ptr = cport->argstring[0] + 1;
  1040.                                 while (*ptr && isspace(*ptr))
  1041.                                     ptr++;
  1042.                                 if (!*ptr | isspace(*ptr))
  1043.                                     ndos_parrentdir();
  1044.                                 else
  1045.                                 {
  1046.                                     ioprintf("/ unknown command\n");
  1047.                                 }
  1048.                             }
  1049.                             else if (!Stricmp(cport->argstring[0],"makefilesystem"))
  1050.                             {
  1051.                                 LowLevelCommand_makefilesystem();
  1052.                                 nostdcmd = FALSE;
  1053.                             }
  1054.                             else if (!Stricmp(cport->argstring[0],"makeroot"))
  1055.                             {
  1056.                                 LowLevelCommand_makeroot();
  1057.                                 nostdcmd = FALSE;
  1058.                             }
  1059.                             else if (!Stricmp(cport->argstring[0],"adddir"))
  1060.                             {
  1061.                                 LowLevelCommand_adddirectory(cport->argstring[1]);
  1062.                                 nostdcmd = FALSE;
  1063.                             }
  1064.                             else if (!Stricmp(cport->argstring[0],"addlink"))
  1065.                             {
  1066.                                 LowLevelCommand_addlink(cport->argstring[1]);
  1067.                                 nostdcmd = FALSE;
  1068.                             }
  1069.                             else if (!Stricmp(cport->argstring[0],"addcommand"))
  1070.                             {
  1071.                                 LowLevelCommand_addcommand(cport->argstring[1]);
  1072.                                 nostdcmd = FALSE;
  1073.                             }
  1074.                             else
  1075.                             {
  1076.                                 if (ndos_execute(cport->argstring[0]))
  1077.                                 {
  1078.                                     ioprintf("%s: Unknown command\n",cport->argstring[0]);
  1079.                                     sprintf(buffer,"%ssys.mainmenu.mainport",cport->sysdirs->systext);
  1080.                                     ShowText(buffer);LF();
  1081.                                 }
  1082.                             }
  1083.                         }
  1084.                     }
  1085.                 }
  1086.             }
  1087.         }
  1088.         counter++;
  1089.     }
  1090.     SaveMainPortConfig(mainportconfig);
  1091. }
  1092.  
  1093. void c_StartPort()
  1094. {
  1095.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1096.     char buffer[200];
  1097.     char Cancel=FALSE;
  1098.     ULONG Usernummer,user2;
  1099.     char counter=0;
  1100.     BPTR mulder;
  1101.     ULONG ulong,cmdid;
  1102.     BOOL nostdcmd;        // no standart command
  1103.     struct PortData *cport2;
  1104.     struct PortData2 *nc;
  1105.  
  1106.     if (cport->network.online)
  1107.     {
  1108.         sprintf(buffer,"%ssys.start.net",cport->sysdirs->systext);
  1109.         ShowText(buffer);LF();
  1110.         ioprintf("NOVIA- Baud Bandit Netware Software.  Version 0.74 alpha \n");
  1111.         ioprintf("Copyright (c)1996,1997,1998,1999 by Thorsten Gehler. All rights reserved.\n\n");
  1112.     }
  1113.  
  1114.     while (!cport->ProgramClose && cport->network.online)
  1115.     {
  1116.         ChangeWhere(getstr(11,50));
  1117.         ChangeScreenStatus("LOCKED");
  1118.  
  1119.         cport->PortStatus=PORT_STATUS_LOGIN;
  1120.  
  1121.         /*** login Sequence ***/
  1122.  
  1123.         ClearMemQuick(buffer,200);
  1124.         Writeio("Login: ",-1);
  1125.         Getstring(buffer,0,50,0,0);
  1126.         Writeio("Password: ",-1);
  1127.         Getstring(buffer+100,0,20,0,0);
  1128.         ChangeScreenStatus("ONLINE");
  1129.  
  1130.         if (cport->network.online && (ulong=SearchUser(buffer)))
  1131.         {
  1132.             ClearMemQuick(&cport->LocalUser,sizeof(UserData));
  1133.             ClearMemQuick(&cport->EditUser,sizeof(UserData));
  1134.             if (LoadUser(&cport->LocalUser,ulong))
  1135.             {
  1136.                 ChangeWhere(getstr(11,55));        // Verification
  1137.                 ioprintf("Current User is :%s (%d)\n",cport->LocalUser.Handle,ulong);
  1138.                 cport->PortStatus=PORT_STATUS_ONLINE;
  1139.                 SendMsg(cport->MainPort,cport,0,MSG_PORT_CHANGE,NULL);
  1140.             }
  1141.  
  1142.         }
  1143.  
  1144.         if (cport->network.online && cport->PortStatus==PORT_STATUS_ONLINE)
  1145.         {
  1146.             ChangeWhere(getstr(11,60));            // Updating database...
  1147.             ioprintf("Updating System Database... please wait.\n\n");
  1148.             LoadUser(&cport->LocalUser,Usernummer);
  1149.             sprintf(buffer,"%ssys.start.new",cport->sysdirs->systext);
  1150.             ShowText(buffer);LF();
  1151.             sprintf(buffer,"%ssys.welcome.new",cport->sysdirs->systext);
  1152.             ShowText(buffer);LF();
  1153.         }
  1154.  
  1155.         if (ndos_openroot())
  1156.             ioprintf("root opened\n");
  1157.  
  1158.         while (cport->network.online && cport->PortStatus==PORT_STATUS_ONLINE && !cport->ProgramClose)
  1159.         {
  1160.             ChangeWhere(getstr(11,65));            // MainMenu
  1161.  
  1162.             ioprintf("\nc3%d.%s> c7",cport->clientconfig.IDNumber,cport->currentdirname);
  1163.             Getstring(cport->inputbuffer,0,80,BUFFERED,0);
  1164.             GetArg(cport->inputbuffer);
  1165.             nostdcmd=TRUE;
  1166.             switch(cmdid = GetCommandID(cport->argstring[0]))
  1167.             {
  1168.                 case CMD_LIST:
  1169.                     ioprintf(getstr(11,50));                    
  1170.                     nostdcmd=FALSE;
  1171.                     break;
  1172.                 case CMD_EDITCLIENT:
  1173.                     if (cport->systemservice)
  1174.                     {
  1175.                         nostdcmd=FALSE;
  1176.                     }
  1177.                     break;
  1178.             }
  1179.             if (nostdcmd)
  1180.             {    
  1181.                 if (!ndos_changedir(cport->inputbuffer))
  1182.                 {
  1183.                     if (StrToLong(cport->inputbuffer,(LONG *)&ulong))
  1184.                     {
  1185.                         BOOL founded            = FALSE;
  1186.                         ItemEntryBlock *ieb    = cport->itementrylist.lh_Head;
  1187.                         while (!founded && ieb->ln_Succ)
  1188.                         {
  1189.                             if (ieb->IDNumber == ulong)
  1190.                                 founded = TRUE;
  1191.                             else
  1192.                                 ieb = ieb->ln_Succ;
  1193.                         }
  1194.                         if (founded)
  1195.                         {
  1196.                             if (ieb->ItemType == ITEMTYPE_SUBBOARD) 
  1197.                             {
  1198.                                 if (!ndos_changedir(ieb->filename))
  1199.                                     founded = FALSE;
  1200.                             }
  1201.                             else
  1202.                             {
  1203.                                 if (ieb->ItemType == ITEMTYPE_MESSAGE)
  1204.                                 ndos_readmessage(ieb);
  1205.                             }
  1206.                         }
  1207.                         if (!founded)
  1208.                         {
  1209.                             if (cport->inputbuffer[0] == '*')
  1210.                             {
  1211.                                 ndos_tstselect(cport->inputbuffer);
  1212.                             }
  1213.                             else
  1214.                             {
  1215.                                 ioprintf("%s: Unknown command\n",cport->argstring[0]);
  1216.                                 sprintf(buffer,"%ssys.mainmenu.mainport",cport->sysdirs->systext);
  1217.                                 ShowText(buffer);LF();
  1218.                             }
  1219.                         }
  1220.                     }
  1221.                 }
  1222.             }
  1223.         }
  1224.     }
  1225.     cport->PortStatus    = PORT_STATUS_WAITCALL;
  1226.     SendMsg(cport->MainPort,  cport, 0, MSG_PORT_LOGOFF, NULL);
  1227.     SN_HangingUP();
  1228.     cport->systemservice=FALSE;
  1229.     ioprintf("c7%s c3logged off\n",cport->LocalUser.Handle);
  1230. }
  1231.  
  1232. BOOL AddClientPort( PortData *cport2)
  1233. {
  1234.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1235.     BPTR mulder;
  1236.     struct PortData2 *newclient=MyAllocVec(sizeof(PortData2),MEMF_ANY|MEMF_CLEAR,"main: AddClientPort(), newclient");
  1237.     char buffer[80];
  1238.     char *txtptr;
  1239.     if (newclient==0)return FALSE;
  1240.     numberofclients++;
  1241.     cport2->UL.UserEntrys=cport->UL.UserEntrys;
  1242.     cport2->UL.utable=cport->UL.utable;
  1243.     cport2->UL.List_Status=cport->UL.List_Status;
  1244.     newclient->port_address=cport2;
  1245.     AddTail(client_list,(Node *)newclient);
  1246.     sprintf(buffer,"Adding new Port ID:%d",numberofclients);
  1247.     SystemMessage(buffer);
  1248.     SendGUIMsg(GUIMSG_CLIENT_ADD,cport2);
  1249.     return TRUE;
  1250. }
  1251.  
  1252. struct PortData *NewClientPort()
  1253. {
  1254.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1255.     BPTR mulder;
  1256.     struct PortData2 *nc=NULL;
  1257.     struct PortData *cport2=NULL;
  1258.     char buffer[80];
  1259.     char *txtptr;
  1260.     if (!(cport2=MyAllocVec(sizeof(PortData),MEMF_ANY|MEMF_CLEAR,"main: NewClientPort(), cport2")))return NULL;
  1261.     if (!(nc=MyAllocVec(sizeof(PortData2),MEMF_ANY|MEMF_CLEAR,"main: NewClientPort(), nc")))
  1262.     {
  1263.         MyFreeVec(cport2,"FREE main: NewClientPort(), cport2");
  1264.         return NULL;
  1265.     }
  1266.     numberofclients++;
  1267.     cport2->clientconfig.IDNumber=numberofclients;
  1268.     cport2->UL.UserEntrys=cport->UL.UserEntrys;
  1269.     cport2->UL.utable=cport->UL.utable;
  1270.     cport2->UL.List_Status=cport->UL.List_Status;
  1271.     nc->port_address=cport2;
  1272.     AddTail(client_list,(Node *)nc);
  1273.     sprintf(buffer,"Adding new Port ID:%d",numberofclients);
  1274.     SystemMessage(buffer);
  1275.  
  1276.     sprintf(buffer,"%ssys.clientconfig",cport->sysdirs->sysdata);
  1277.  
  1278.     mulder=Open(buffer,MODE_READWRITE);
  1279.     Seek(mulder,sizeof(ClientConfig)*cport2->clientconfig.IDNumber-1,OFFSET_BEGINNING);
  1280.     FWrite(mulder,&cport2->clientconfig,sizeof(ClientConfig),1);
  1281.     Close(mulder);
  1282.  
  1283.     SaveClientList();
  1284.     SendGUIMsg(GUIMSG_CLIENT_ADD,cport2);
  1285.     return cport2;
  1286. }
  1287.  
  1288.  
  1289. /*
  1290. BOOL ClearClientPort( PortData *cport2)
  1291.     cport2->PortStatus=PORT_STATUS_
  1292. */
  1293. BOOL CloseClientPort( LONG PortID)
  1294. {
  1295.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1296.     struct PortData2 *nc=(PortData2 *)client_list->lh_Head;
  1297.     struct PortData *cport2;
  1298.     BOOL removed=FALSE;
  1299.     char buffer[200];
  1300.     ULONG counter;
  1301.     if (PortID>=0)
  1302.     {
  1303.         while (nc->port_node.ln_Succ)
  1304.         {
  1305.             if (nc->port_address->clientconfig.IDNumber==PortID)
  1306.             {
  1307.                 if (nc->port_address->PortStatus>0)
  1308.                 {
  1309.                     SendMsg(nc->port_address->LocalPort,nc->port_address,0,MSG_PORT_CLOSE,0);
  1310.                 }
  1311.                 else
  1312.                 {
  1313.                     nc=(PortData2 *)nc->port_node.ln_Succ;
  1314.                     ioprintf("c3Port c7%d c3is already closed.\n",nc->port_address->clientconfig.IDNumber);
  1315.                 }
  1316.                 return removed;
  1317.             }
  1318.             nc=(PortData2 *)nc->port_node.ln_Succ;
  1319.         }
  1320.         ioprintf("c7Port c3%d c7is closed now.\n",removed);
  1321.     }
  1322.     return removed;
  1323. }
  1324.  
  1325. /*
  1326. BOOL RemoveClientPort( PortData2 *nc)
  1327. {
  1328.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1329.     PortData *cport2;
  1330.     if (nc)
  1331.     {
  1332.         Remove((Node *)nc);
  1333.         cport2=nc->port_address;
  1334.         MyFreeVec(cport2,"");
  1335.         MyFreeVec(nc,"");
  1336.         SystemMessage("Port removed.");
  1337.         numberofclients--;
  1338.     }
  1339.     else
  1340.     {
  1341.         SystemMessage("Can't remove client, wrong NC-Pointer.");
  1342.         return FALSE;
  1343.     }
  1344. }
  1345. */
  1346.  
  1347. ULONG SearchClientORUser( char *name)
  1348. {
  1349. /*    char buffer[100];
  1350.     UserNode *start;
  1351.     ULONG counter;
  1352.      BPTR mulder;
  1353.     long index;
  1354.     char Quit=FALSE;
  1355.     StrToLong(username,(long *)&counter);
  1356.     if (counter>0)
  1357.     {
  1358.         for (start=cport->UL.un_first;(start!=0 && Quit==FALSE);start=start->us_Succ)
  1359.             if (start->IDNumber==counter)Quit=TRUE;
  1360.         if (Quit==TRUE)
  1361.         {
  1362.             sprintf(buffer,"Is %s correct ?",start->Handle);
  1363.             LF();Writeio(buffer,-1);
  1364.             if (Yesno(TRUE,0)==TRUE)return counter;
  1365.         }
  1366.     }
  1367.     else
  1368.     {
  1369.         start=cport->UL.un_first;
  1370.         for (counter=0;counter<cport->UL.UserEntrys;counter++)
  1371.         {
  1372.             if (!stricmp(start-Handle,username))return start->IDNumber;
  1373.             start=start->us_Succ;
  1374.         }
  1375.     }*/
  1376.     return 1;
  1377. }
  1378.  
  1379.  
  1380. void FreeGUIMsg( GUIMsg *msg)
  1381. {
  1382.     MyFreeVec(msg,"FREE main: FreeGUIMsg(), msg");
  1383. }
  1384.  
  1385. void ReturnGUIMsg(GUIMsg *msg)
  1386. {
  1387.     msg->cmdid=GUIMSG_REPLY;
  1388.     if (GUIPort)ReplyMsg((Message *)msg);
  1389. }
  1390.  
  1391. BOOL SendGUIMsg( LONG msgid, APTR data)
  1392. {
  1393.     struct GUIMsg *msg;
  1394.     if (GUIPort)
  1395.     {
  1396.         msg=MyAllocVec(sizeof(GUIMsg),MEMF_ANY|MEMF_CLEAR,"main: SendGUIMsg(), msg");
  1397.         if (!(msg))return FALSE;
  1398.         msg->data=data;
  1399.         msg->msg.mn_Length=sizeof(GUIMsg);
  1400.         msg->msg.mn_ReplyPort=MainGUIPort;
  1401.         msg->cmdid=msgid;
  1402.         PutMsg(GUIPort,(Message *)msg);
  1403.         return TRUE;
  1404.     }
  1405.     else
  1406.     {
  1407.         return FALSE;
  1408.     }
  1409. }
  1410.  
  1411. void LoadClientList()
  1412. {
  1413.     struct PortData *cport=MainTask->tc_UserData;
  1414.     BPTR mulder;
  1415.     char buffer[100];
  1416.     struct PortData2 *nc;
  1417.     struct PortData *cport2;
  1418.     BOOL quit=FALSE;
  1419.     ULONG result;
  1420.     sprintf(buffer,"%ssys.clientconfig",mainportconfig->sysdirs.sysdata);
  1421.     mulder=Open(buffer,MODE_OLDFILE);
  1422.     if (!mulder)return;
  1423.     SetIoErr(0);
  1424.     while(!quit)
  1425.     {
  1426.         if (nc=(PortData2 *)MyAllocVec(sizeof(PortData2),MEMF_ANY|MEMF_CLEAR,""))
  1427.         {
  1428.             if (cport2=(PortData *)MyAllocVec(sizeof(PortData),MEMF_ANY|MEMF_CLEAR,""))
  1429.             {
  1430.                 result=FRead(mulder,&cport2->clientconfig,sizeof(ClientConfig),1);
  1431.                 if (!result)
  1432.                 {
  1433.                     quit=TRUE;
  1434.                     MyFreeVec(cport2,"");
  1435.                     MyFreeVec(nc,"");
  1436.                 }
  1437.                 else
  1438.                 {
  1439.                     nc->port_address=cport2;
  1440.                     nc->port_address->PortStatus=0;
  1441.                     AddTail(client_list,(Node *)nc);
  1442.                     numberofclients++;
  1443.                     nc->port_address->clientconfig.IDNumber=numberofclients;
  1444.                     nc->port_address->UL.UserEntrys=cport->UL.UserEntrys;
  1445.                     nc->port_address->UL.utable=cport->UL.utable;
  1446.                     nc->port_address->UL.List_Status=cport->UL.List_Status;
  1447.                     nc->port_address->sysdirs=&mainportconfig->sysdirs;
  1448.                     nc->port_address->strgroup=cport->strgroup;
  1449.                     nc->port_address->strgroups=cport->strgroups;
  1450.                     if (nc->port_address->clientconfig.LoadPortatstart)
  1451.                     {
  1452.                         ioprintf("setting up client id: %d",nc->port_address->clientconfig.IDNumber);
  1453.                         nc->port_address->PortStatus=PORT_STATUS_WAITLOAD;
  1454.                             CreateClient(nc->port_address);
  1455.                         CR();ioprintf("Cc2donec7\n");
  1456.                     }
  1457.                 }
  1458.             }
  1459.             else
  1460.             {
  1461.                 MyFreeVec(nc,"");
  1462.                 quit=TRUE;
  1463.             }
  1464.         }
  1465.         else {quit=TRUE;}
  1466.     }
  1467.     Close(mulder);
  1468.     SendGUIMsg(GUIMSG_CLIENTLIST_REFRESH,0);
  1469. }
  1470.  
  1471. void SaveClientList()
  1472. {
  1473.     BPTR mulder;
  1474.     char buffer[100];
  1475.     struct PortData2 *nc;
  1476.     BOOL quit=FALSE;
  1477.     ULONG counter=0;
  1478.     sprintf(buffer,"%ssys.clientconfig",mainportconfig->sysdirs.sysdata);
  1479.     mulder=Open(buffer,MODE_NEWFILE);
  1480.     if (!mulder)return;
  1481.     nc=(PortData2 *)client_list->lh_Head;
  1482.     while (nc->port_node.ln_Succ!=0 && counter<10)
  1483.     {
  1484.         FWrite(mulder,&nc->port_address->clientconfig,sizeof(ClientConfig),1);
  1485.         nc=(PortData2 *)nc->port_node.ln_Succ;
  1486.         counter++;
  1487.     }
  1488.     Close(mulder);
  1489. }
  1490.  
  1491. APTR MyAllocVec( ULONG size,  ULONG flags,  char *text)
  1492. {
  1493. /*    APTR address=AllocVec(size,flags);
  1494.     MyMemEntry *entry;
  1495.     char txtout[80];
  1496.     BPTR mulder=Open("boot:logs/log",MODE_OLDFILE);
  1497.     if (address)
  1498.     {
  1499.         entry=AllocVec(sizeof(MyMemEntry),MEMF_ANY);
  1500.         entry->address=address;
  1501.         alloc_mem_list->entrys++;
  1502.         AddTail((List *)alloc_mem_list,(Node *)entry);
  1503.         sprintf(entry->text,"FREE  MAIN (OK): %p %s - Entry: %d\n",address,text,alloc_mem_list->entrys);
  1504.         if (mulder)
  1505.         {
  1506.             sprintf(txtout,"ALLOC MAIN (OK): %p %s\n",address,text);
  1507.             Seek(mulder,0,OFFSET_END);
  1508.             FPuts(mulder,txtout);
  1509.         }
  1510.     }
  1511.     else
  1512.     {
  1513.         sprintf(txtout,"ALLOC MAIN (FAILAT): %p %s\n",address,text);
  1514.         if (mulder)
  1515.         {
  1516.             Seek(mulder,0,OFFSET_END);
  1517.             FPuts(mulder,txtout);
  1518.         }
  1519.     }
  1520.     if (mulder)Close(mulder);
  1521.     return address;*/
  1522.     return AllocVec(size,flags);
  1523. }
  1524.  
  1525. void MyFreeVec( APTR address,  char *text)
  1526. {
  1527. /*    MyMemEntry *entry=(MyMemEntry *)alloc_mem_list->lh_Head;
  1528.     BOOL quit=FALSE;
  1529.     char txtout[80];
  1530.     BPTR mulder=Open("boot:logs/log",MODE_OLDFILE);
  1531.     while (entry && !quit)
  1532.     {
  1533.         if(entry->address==address)
  1534.         {    
  1535.             if (mulder)
  1536.             {
  1537.                 sprintf(txtout,"FREE  MAIN (OK): %p %s - entry: %d\n",address,text,alloc_mem_list->entrys);
  1538.                 Seek(mulder,0,OFFSET_END);
  1539.                 FPuts(mulder,txtout);
  1540.             }
  1541.             quit=TRUE;
  1542.             Remove((Node *)entry);
  1543.             FreeVec(address);
  1544.             FreeVec(entry);
  1545.             alloc_mem_list->entrys--;
  1546.         }
  1547.         entry=(MyMemEntry *)entry->ln_Succ;
  1548.     }
  1549.     if (!quit)
  1550.     {
  1551.         sprintf(txtout,"FREE  MAIN (FAILAT): %p %s - entry: %d\n",address,text,alloc_mem_list->entrys);
  1552.         if (mulder)
  1553.         {
  1554.             Seek(mulder,0,OFFSET_END);
  1555.             FPuts(mulder,txtout);
  1556.         }
  1557.     }
  1558.  
  1559.     if (mulder)Close(mulder);*/
  1560.     FreeVec(address);
  1561. }
  1562.  
  1563. void SaveClientConfig( ClientConfig *cconfig)
  1564. {
  1565.     BPTR mulder;
  1566.     char buffer[100];
  1567.     sprintf(buffer,"%ssys.clientconfig",mainportconfig->sysdirs.sysdata);
  1568.     mulder=Open(buffer,MODE_READWRITE);
  1569.     if (!mulder)return;
  1570.     Seek(mulder,(cconfig->IDNumber-1)*sizeof(ClientConfig),OFFSET_BEGINNING);
  1571.     Write(mulder,cconfig,sizeof(ClientConfig));
  1572.     Close(mulder);
  1573. }
  1574.  
  1575. void SaveMainPortConfig( MainPortConfig *pointer)
  1576. {
  1577.     BPTR mulder=Open("envarc:novia_mainportconfig",MODE_NEWFILE);
  1578.     if (!mulder)return;
  1579.     Write(mulder,pointer,sizeof(MainPortConfig));
  1580.     Close(mulder);
  1581. }
  1582.  
  1583. struct MainPortConfig *LoadMainPortConfig( MainPortConfig *pointer)
  1584. {
  1585.     struct MainPortConfig *result;
  1586.     BPTR mulder;
  1587.     if ((mulder = Open("envarc:novia_mainportconfig",MODE_OLDFILE)))
  1588.     {
  1589.         if (Read(mulder,pointer,sizeof(MainPortConfig)) == sizeof(MainPortConfig))
  1590.         {
  1591.             BPTR fh;            
  1592.             pointer->numberofmci        = 0;
  1593.             pointer->mcicmd            = 0;
  1594.             NewList((List *)&pointer->ClientList);
  1595.             pointer->rexxtempcounter= 0;
  1596.             pointer->guiloaded        = 0;
  1597.             NewList((List *)&pointer->LocalMailServerList);
  1598.             NewList((List *)&pointer->POP3ServerList);
  1599.             NewList((List *)&pointer->EventList);
  1600.             pointer->rootdir            = 0;
  1601.  
  1602.             if ((fh = Open("novia:sysdata/counter/ipcounter", MODE_OLDFILE)))
  1603.             {
  1604.                 Read(fh, &pointer->MessageIPCounter64, 8);
  1605.                 Close(fh);
  1606.             }
  1607.  
  1608.             result = pointer;
  1609.         }
  1610.         Close(mulder);
  1611.     }
  1612.     else
  1613.     {
  1614.         printf("can't open ENVARC:novia_mainportconfig.\n");
  1615.     }
  1616.     return(result);
  1617. }
  1618.  
  1619.  
  1620. void LoadCommandList(Directory *cmddir)
  1621. {
  1622.     struct PortData        *cport = (PortData *)MainTask->tc_UserData;
  1623.     char                        buffer[100];
  1624.     BPTR                        fh;
  1625.     struct CommandEntry    *commandentry;
  1626.     char                        quit = FALSE;
  1627.     sprintf(buffer,"novia:bin/.files");
  1628.  
  1629.     Writeio("c7z0configure low level commandlist...", -1);
  1630.     NewList((List *)&cmddir->entrylist);
  1631.     /* Add Kernel Low Level Commands */
  1632.  
  1633.     if (cport->cmddir->iib.fullpath)
  1634.         FreeVec(cport->cmddir->iib.fullpath);
  1635.     if ((cport->cmddir->iib.fullpath = AllocVec(strlen("novia:bin/") + 1, MEMF_ANY | MEMF_CLEAR)))
  1636.         strcpy(cport->cmddir->iib.fullpath, "novia:bin/");
  1637.     if ((fh = Open(buffer,MODE_OLDFILE)))
  1638.     {
  1639.         while (!quit)
  1640.         {
  1641.             if ((commandentry = AllocVec(sizeof(CommandEntry), MEMF_ANY|MEMF_CLEAR)))
  1642.             {
  1643.                 if (Read(fh, commandentry, sizeof(CommandEntry)) == sizeof(CommandEntry))
  1644.                 {
  1645.                     if (!commandentry->iib.Deleted)
  1646.                     {
  1647.                         AddTail((List *)&cmddir->entrylist, (Node *)commandentry);
  1648.                         cmddir->ItemEntrys++;
  1649.                     }
  1650.                     else
  1651.                         FreeVec(commandentry);
  1652.                 }
  1653.                 else
  1654.                 {
  1655.                     CR();ioprintf("Cc2donec7\n");
  1656.                     quit = TRUE;
  1657.                 }
  1658.             }
  1659.             else
  1660.             {
  1661.                 CR();ioprintf("Cc1failatc7\n");
  1662.                 printf("can't open: %s\n",buffer);
  1663.                 quit = TRUE;
  1664.             }
  1665.         }
  1666.         Close(fh);
  1667.     }
  1668.     else
  1669.     {
  1670.         CR();ioprintf("Cc1failatc7\n");
  1671.         printf("can't open: %s\n",buffer);
  1672.     }
  1673. }
  1674.  
  1675.  
  1676. void LoadMCICodes(ULONG *numberofmci, struct mcicode *mcicmd)
  1677. {
  1678.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  1679.     char oldcolor=cport->color;
  1680.     char oldbcolor=cport->bcolor;
  1681.     BPTR mulder;
  1682.     char buffer[100];
  1683.     sprintf(buffer,"%ssys.mcioffsettable",mainportconfig->sysdirs.sysdata);
  1684.     mulder=Open(buffer,MODE_OLDFILE);
  1685.     Writeio("c7z0creating MCI-Offset table... ",-1);
  1686.     if (mulder==NULL)
  1687.     {
  1688.         ioprintf("can't open MCI Offsettable");
  1689.         CR();ioprintf("Cc1failatc7\n");
  1690.         return;
  1691.     }
  1692.     Read(mulder,numberofmci,4);
  1693.     ioprintf("%d MCI's found",*numberofmci);
  1694.     if (*numberofmci>0)
  1695.     {
  1696.         if (!(mcicmd=MyAllocVec(sizeof(mcicode)*(*numberofmci),MEMF_ANY,"LoadMCICodes: mcicode")))
  1697.             CloseIt(20,"Can't alloc mem for MCI Offsettable");
  1698.         Read(mulder,mcicmd,(*numberofmci)*sizeof(mcicode));
  1699.     }
  1700.     else
  1701.         CloseIt(20,"Can't load MCI Offsettable");
  1702.     Close(mulder);
  1703.     CR();ioprintf("Cc2donec7\n");
  1704.     SetColor(oldcolor);
  1705.     SetBColor(oldbcolor);
  1706. }
  1707.  
  1708. long GetCommandID(char *string)
  1709. {
  1710.     struct PortData    *cport    = (PortData *)FindTask(NULL)->tc_UserData;
  1711.     ULONG                    counter;
  1712.     long                    result    = NULL;
  1713.     char                    *ptr        = string;
  1714.     CommandEntry        *commandentry;
  1715.     while (*ptr)
  1716.     {
  1717.         *ptr = toupper(*ptr);
  1718.         ptr++;
  1719.     }
  1720.     commandentry = (CommandEntry *)cport->cmddir->entrylist.mlh_Head;
  1721.     while (!result && commandentry->iib.ln_Succ)
  1722.     {
  1723.         if (!strcmp(commandentry->iib.Title, string))
  1724.         {
  1725.             result = commandentry->CommandID;
  1726.         }
  1727.         else
  1728.             commandentry = (CommandEntry *)commandentry->iib.ln_Succ;
  1729.     }
  1730.     return result;
  1731. }
  1732.  
  1733. BOOL LoadMemberList(char *filename, List *ulist)
  1734. {
  1735.     BPTR mulder=Open(filename,MODE_OLDFILE);
  1736.     if (mulder)
  1737.     {
  1738.         char buffer[80];
  1739.         ULONG userid;
  1740.         LONG DOSError;
  1741.         char counter;
  1742.         struct Member *member;
  1743.         NewList(ulist);
  1744.         while (FGets(mulder,buffer,80))
  1745.         {
  1746.             for (counter=0; (counter<80 && buffer[counter]!=10 && buffer[counter]!=13);counter++);
  1747.             if (buffer[counter]==10|buffer[counter]==13)buffer[counter]=0;
  1748.             if ((userid=FindUser(buffer)))
  1749.             {
  1750.                 if (member=AllocVec(sizeof(Member),MEMF_ANY))
  1751.                 {
  1752.                     member->UserID=userid;
  1753.                     AddTail(ulist,(Node *)member);
  1754.                 }
  1755.             }
  1756.         }
  1757.         if (DOSError=IoErr())
  1758.             PrintDosError(DOSError);
  1759.         Close(mulder);
  1760.         return TRUE;
  1761.     }
  1762.     else
  1763.         return FALSE;
  1764. }
  1765.  
  1766. BOOL SaveMemberList(char *filename, List *ulist)
  1767. {
  1768.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  1769.     BPTR mulder=Open(filename,MODE_NEWFILE);
  1770.     if (mulder)
  1771.     {
  1772.         struct Member *member=(Member *)ulist->lh_Head;
  1773.         while(member->ln_Succ)
  1774.         {
  1775.             if (member->UserID>0 && member->UserID<=cport->UL.UserEntrys)
  1776.             {
  1777.                 FPuts(mulder,cport->UL.utable[member->UserID].Handle);
  1778.                 FPutC(mulder,10);
  1779.             }
  1780.             member=member->ln_Succ;
  1781.         }
  1782.         Close(mulder);
  1783.         return TRUE;
  1784.     }
  1785.     else
  1786.         return FALSE;
  1787. }
  1788.  
  1789. void RepairUserList( UserList *ulist)
  1790. {
  1791.     struct PortData *cport = (PortData *)FindTask(NULL)->tc_UserData;
  1792.     UserNode start;
  1793.     ULONG counter=1;
  1794.     BPTR mulder;
  1795.     char buffer[100];
  1796.  
  1797.     sprintf(buffer,"%ssys.userdata.a",mainportconfig->sysdirs.sysdata);
  1798.  
  1799.     if (mulder=Open(buffer,MODE_NEWFILE))
  1800.     {
  1801.         Write(mulder,&counter,4);
  1802.         while (LoadUser(&cport->EditUser,counter))
  1803.         {
  1804.             memset(&start,0,sizeof(UserNode));
  1805.             start.IDNumber=cport->EditUser.IDNumber;
  1806.             start.IPNumber=cport->EditUser.IPNumber;
  1807.             CopyMem(cport->EditUser.Handle,start.Handle,20);
  1808.             start.Status=1;
  1809.             Write(mulder,&start,sizeof(UserNode));
  1810.             counter++;
  1811.         }
  1812.         counter--;
  1813.         Seek(mulder,0,OFFSET_BEGINNING);
  1814.         Write(mulder,&counter,4);
  1815.         Close(mulder);
  1816.     }
  1817. }
  1818.  
  1819. void LoadStringTable()
  1820. {
  1821.     #define MAX_ENTRYS 1000
  1822.     #define MIN_ENTRYS 50
  1823.  
  1824.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  1825.     BPTR mulder;
  1826.     char readbuffer[256];
  1827.     UWORD stringid=0;
  1828.     ULONG strlength;
  1829.     ULONG ulong;
  1830.     ULONG linecounter=1;
  1831.     struct STR_Group *grouppt=NULL;
  1832.     char *pt;
  1833.     cport->strgroups=256;
  1834.  
  1835.     if (cport->strgroup=AllocVec(sizeof(STR_Group)*256,MEMF_ANY|MEMF_CLEAR))
  1836.     {
  1837.         sprintf(readbuffer,"%ssys.strings",cport->sysdirs->sysdata);
  1838.         if (mulder=Open(readbuffer,MODE_OLDFILE))
  1839.         {
  1840.             BOOL quit=FALSE;
  1841.             while (!quit && FGets(mulder,readbuffer,255))
  1842.             {
  1843.                 strlength=strlen(readbuffer);
  1844.                 if (readbuffer[strlength-1]==10)readbuffer[strlength-1]=0;
  1845.                 if ((strlength>5) && (!strncmp(readbuffer,"GROUP",5)))
  1846.                 {
  1847.                     pt=readbuffer+5;
  1848.                     while (*pt==32)pt++;
  1849.                     StrToLong(pt,(LONG *)&ulong);
  1850.                     if (ulong>cport->strgroups)
  1851.                     {
  1852.                         ioprintf("string table error in line: %d. invalid GROUPID: %d\n->%s\n",linecounter,ulong,readbuffer);
  1853.                         grouppt=NULL;
  1854.                     }
  1855.                     else
  1856.                         grouppt=&cport->strgroup[ulong];
  1857.                 }
  1858.                 else
  1859.                 {
  1860.                     if (grouppt && (StrToLong(readbuffer,(LONG *)&ulong)>-1))
  1861.                     {
  1862.                         stringid=(UWORD)ulong;
  1863.                         if (stringid>MAX_ENTRYS)
  1864.                             ioprintf("string table error in line: %d. invalid STRINGID: %d\n->%s\n",linecounter,stringid,readbuffer);
  1865.                         else
  1866.                         {
  1867.                             if (stringid>=grouppt->entrys)
  1868.                             {
  1869.                                 if (grouppt->entrys)
  1870.                                 {
  1871.                                     char **newtable;
  1872.                                     if (newtable=AllocVec((stringid+MIN_ENTRYS)*4,MEMF_ANY|MEMF_CLEAR))
  1873.                                     {
  1874.                                         for (ulong=0;ulong<grouppt->entrys;ulong++)
  1875.                                         {
  1876.                                             newtable[ulong]=grouppt->table[ulong];
  1877.                                         }
  1878.                                         FreeVec(grouppt->table);
  1879.                                         grouppt->table=newtable;
  1880.                                         grouppt->entrys=stringid+MIN_ENTRYS;
  1881.                                     }
  1882.                                 }
  1883.                                 else
  1884.                                 {
  1885.                                     if (grouppt->table=AllocVec(MIN_ENTRYS*4,MEMF_ANY|MEMF_CLEAR))
  1886.                                         grouppt->entrys=MIN_ENTRYS;
  1887.                                 }
  1888.                             }
  1889.                             if (stringid<grouppt->entrys)
  1890.                             {
  1891.                                 pt=readbuffer;
  1892.                                 while (*pt!=':' && *pt!=0)pt++;
  1893.                                 if (*pt!=0)
  1894.                                 {
  1895.                                     pt++;
  1896.                                     strlength=strlen(pt);
  1897.                                     if (grouppt->table[stringid])
  1898.                                         ioprintf("string table error in line: %d. String redefined ID: %d\n->%s\n",linecounter,stringid,readbuffer);
  1899.                                     else
  1900.                                         if (grouppt->table[stringid]=AllocVec(strlength+1,MEMF_ANY|MEMF_CLEAR))
  1901.                                         {
  1902.                                             CopyMem(pt,grouppt->table[stringid],strlength);
  1903.                                             grouppt->maxid++;
  1904.                                         }
  1905.                                 }
  1906.                             }
  1907.                         }
  1908.                     }
  1909.                 }
  1910.                 linecounter++;
  1911.             }
  1912.             Close(mulder);
  1913.         }
  1914.         else
  1915.         {
  1916.             ioprintf("can't open %s\n.",readbuffer);
  1917.             FreeVec(cport->strgroup);
  1918.             cport->strgroups=0;
  1919.             cport->strgroup=NULL;
  1920.         }
  1921.     }
  1922. }
  1923.  
  1924. void RemoveStringList()
  1925. {
  1926.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  1927.     struct STR_Group *grouppt=cport->strgroup;
  1928.     UWORD counter,counter2;
  1929.     if (grouppt && cport->strgroups)
  1930.     {
  1931.         for (counter=0; counter<cport->strgroups; counter++)
  1932.         {
  1933.             if (grouppt->table)
  1934.             {
  1935.                 for (counter2=0; counter2<grouppt->entrys; counter2++)
  1936.                 {
  1937.                     if (grouppt->table[counter2])
  1938.                         FreeVec(grouppt->table[counter2]);
  1939.                 }
  1940.                 FreeVec(grouppt->table);
  1941.             }
  1942.             grouppt++;
  1943.         }
  1944.         FreeVec(cport->strgroup);
  1945.         cport->strgroup=0;
  1946.         cport->strgroups=0;
  1947.     }
  1948. }
  1949.  
  1950.  
  1951. struct PortData *c_init()
  1952. {
  1953.     ULONG returncode=FALSE;
  1954.     struct PortData *mport=(PortData *)MainTask->tc_UserData;
  1955.     struct PortData *cport=FindTask(NULL)->tc_UserData;
  1956.     char buffer[200];
  1957.     if (cport->clientconfig.IDNumber)
  1958.     {
  1959.         sprintf(cport->RexxPortName,"NOVIAREXX%d",cport->clientconfig.IDNumber);
  1960.         sprintf(cport->TaskName,"novia_client%d",cport->clientconfig.IDNumber);
  1961.  
  1962.         if (cport->currentdir)
  1963.             nfs_support_closeroot(cport);
  1964.  
  1965.         cport->ProgramClose=FALSE;
  1966.         cport->ConPort=CreateMsgPort();
  1967.         cport->MainPort=mport->MainPort;
  1968.         cport->LocalPort=CreateMsgPort();
  1969.         cport->rexxport=CreateMsgPort();
  1970.         cport->rtport=CreateMsgPort();
  1971.         cport->task=FindTask(NULL);
  1972.         cport->nfs_port = CreateMsgPort();
  1973.  
  1974.         if (!cport->ConPort | !cport->LocalPort | !cport->rexxport | !cport->rtport | !cport->nfs_port)
  1975.         {
  1976.             printf("CLIENT: can't create LocalPort.\n");
  1977.             returncode=TRUE;
  1978.         }
  1979.  
  1980.         if (!returncode)
  1981.         {
  1982.             if (!(cport->inputbuffer = AllocVec(256,MEMF_ANY|MEMF_CLEAR)))
  1983.                 returncode = TRUE;
  1984.         }
  1985.  
  1986.         if (!returncode)
  1987.         {
  1988.             if (cport->ConPort)
  1989.             {
  1990.                 cport->ConRead=CreateIORequest(cport->ConPort,sizeof(IOStdReq));
  1991.                 cport->ConWrite=CreateIORequest(cport->ConPort,sizeof(IOStdReq));
  1992.                 if ((!cport->ConRead)|(!cport->ConWrite))
  1993.                 {
  1994.                     returncode=TRUE;
  1995.                     printf("CLIENT: Can't create IORequest-structure for console.device\n");
  1996.                 }
  1997.             }
  1998.             else
  1999.             {
  2000.                 printf("CLIENT: Can't create MSG-Port for console.device\n");
  2001.                 returncode=TRUE;
  2002.             }
  2003.         }
  2004.  
  2005.         if (!returncode)
  2006.         {
  2007.             if ((cport->TimePort=CreateMsgPort()))
  2008.             {
  2009.                 if (cport->TimerReq=CreateIORequest(cport->TimePort,sizeof(timerequest)))
  2010.                     if (OpenDevice("timer.device",UNIT_VBLANK,(IORequest *)cport->TimerReq,0))
  2011.                     {
  2012.                         printf("can't open timer.device.\n");
  2013.                         returncode=20;
  2014.                     }
  2015.                     else
  2016.                     {
  2017.                         TimerBase = (struct Library *)cport->TimerReq->tr_node.io_Device;
  2018.                         if ((!cport->TimerReq)|(!TimerBase))
  2019.                         {
  2020.                             printf("can't open timer.device.\n");
  2021.                             returncode=TRUE;
  2022.                         }
  2023.                     }
  2024.             }
  2025.             else
  2026.             {
  2027.                 printf("Can't create MSG-Port for timer.device\n");
  2028.                 returncode=TRUE;
  2029.             }
  2030.         }
  2031.         if (!returncode)
  2032.         {
  2033.             cport->Titel=Titel;
  2034. //            strcpy(cport->actitel,Titel);
  2035.             if (!(cport->iobuffer=AllocVec(10000,MEMF_ANY|MEMF_CLEAR)))
  2036.             {
  2037.                 printf("CLIENT: can't alloc mem for iobuffer.\n");
  2038.                 returncode=TRUE;
  2039.             }    
  2040.         }
  2041.  
  2042.         NewList((List *)&cport->iobuffer_list);
  2043.         NewList((List *)&cport->his_list);
  2044.         NewList((List *)&cport->select_list);
  2045.         NewList((List *)&cport->downloadlist);
  2046.         NewList((List *)&cport->rexxlist);
  2047.         NewList((List *)&cport->itementrylist);
  2048.         cport->connect_seq=TRUE;
  2049.  
  2050.         if (cport->rexxport)
  2051.         {
  2052.             cport->rexxport->mp_Node.ln_Pri=0;
  2053.             cport->rexxport->mp_Node.ln_Name=cport->RexxPortName;
  2054.             AddPort(cport->rexxport);
  2055.         }
  2056.         else
  2057.         {
  2058.             printf("can't create rexxport.\n");
  2059.             returncode=TRUE;
  2060.         }
  2061.  
  2062.         if (!returncode)
  2063.         {
  2064.             cport->mymenu=mymenu;
  2065.             cport->Supervisor=TRUE;
  2066.             cport->NewUser=FALSE;
  2067.             cport->Dumped=FALSE;
  2068.             cport->HideAll=FALSE;
  2069.             cport->MuffAll=FALSE;
  2070.             cport->MonitorAll=FALSE;
  2071.             cport->UL=mport->UL;
  2072.             cport->PortStatus=PORT_STATUS_ONLINE;
  2073.  
  2074.             if (cport->clientconfig.OpenScreenatstart)
  2075.                 Monitor_open();
  2076.  
  2077.             ShowText("work:novia/systext/sys.novia.text");
  2078. #ifdef DEBUG
  2079.             printf("next\n");
  2080. #endif
  2081.             cport->strgroup=mport->strgroup;
  2082.             cport->strgroups=mport->strgroups;
  2083.             cport->cmddir=mport->cmddir;
  2084.             cport->mcicmd=mport->mcicmd;
  2085.             cport->numberofmci=mport->numberofmci;
  2086.         }
  2087.         else
  2088.         {
  2089.             c_FreeClientPort();
  2090.         }
  2091.         cport->task=FindTask(NULL);
  2092.     }
  2093.     if (!returncode)
  2094.     {
  2095.         SN_Open();
  2096.         return cport;
  2097.     }
  2098.     else
  2099.         return NULL;
  2100. }
  2101.  
  2102. struct PortData *CreateClient(PortData *cport)
  2103. {
  2104.     char error=FALSE;
  2105.     struct PortData *mport=(PortData *)MainTask->tc_UserData;
  2106.     struct Task *ClientTask=NULL;
  2107.     char buffer[200];
  2108.     struct TagItem ClientProcTagList[] =
  2109.     {
  2110.         {    NP_Entry,        (ULONG)c_main},
  2111.         {    NP_Name,            (ULONG)cport->TaskName},
  2112.         {    NP_StackSize,    20000},
  2113.         {    TAG_DONE,        TAG_DONE},
  2114.     };
  2115.     sprintf(cport->TaskName,"novia_client%d",cport->clientconfig.IDNumber);
  2116.     Forbid();
  2117.     if ((ClientTask=(struct Task *)CreateNewProc(ClientProcTagList)))
  2118.         ClientTask->tc_UserData=cport;
  2119.     Permit();
  2120.     return cport;
  2121. }
  2122.  
  2123.  
  2124. void c_FreeClientPort()
  2125. {
  2126.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  2127.     if (cport)
  2128.     {
  2129.         SN_Close();
  2130.         if (cport->win)
  2131.             ioprintf("Shut down\n");
  2132.         Monitor_close();
  2133.         if (cport->rexxport)
  2134.         {
  2135.             RemPort(cport->rexxport);
  2136.             DeleteMsgPort(cport->rexxport);
  2137.             cport->rexxport=NULL;
  2138.         }
  2139.         NewList((List *)&cport->iobuffer_list);
  2140.         NewList((List *)&cport->his_list);
  2141.         NewList((List *)&cport->select_list);
  2142.         NewList((List *)&cport->downloadlist);
  2143.         NewList((List *)&cport->rexxlist);
  2144.         NewList((List *)&cport->itementrylist);
  2145.         if (cport->inputbuffer)
  2146.         {
  2147.             FreeVec(cport->inputbuffer);
  2148.             cport->inputbuffer = 0;
  2149.         }
  2150.         if (cport->iobuffer)
  2151.         {
  2152.             FreeVec(cport->iobuffer);
  2153.             cport->iobuffer=NULL;
  2154.         }
  2155.         if (cport->ConPort)
  2156.         {
  2157.             DeleteMsgPort(cport->ConPort);
  2158.             cport->ConPort=NULL;
  2159.         }
  2160.         if (cport->ConRead)
  2161.         {
  2162.             DeleteIORequest(cport->ConRead);
  2163.             cport->ConRead=NULL;
  2164.         }
  2165.         if (cport->ConWrite)
  2166.         {
  2167.             DeleteIORequest(cport->ConWrite);
  2168.             cport->ConWrite=NULL;
  2169.         }
  2170.         if (cport->LocalPort)
  2171.         {
  2172.             DeleteMsgPort(cport->LocalPort);
  2173.             cport->LocalPort=NULL;
  2174.         }
  2175.         if (cport->TimerReq)
  2176.         {
  2177.             if (cport->TimerReq->tr_node.io_Device)
  2178.                 CloseDevice((IORequest *)cport->TimerReq);
  2179.             DeleteIORequest((IORequest *)cport->TimerReq);
  2180.         }
  2181.  
  2182.         if (cport->rtport)
  2183.             DeleteMsgPort(cport->rtport);
  2184.  
  2185.         if (cport->TimePort)
  2186.             DeleteMsgPort(cport->TimePort);
  2187.  
  2188.         if (cport->nfs_port)
  2189.         {
  2190.             DeleteMsgPort(cport->nfs_port);
  2191.             cport->nfs_port = NULL;
  2192.         }
  2193.         FindTask(NULL)->tc_UserData=NULL;
  2194.         cport->PortStatus=NULL;
  2195.         cport->task=NULL;
  2196.     }
  2197. #ifdef DEBUG
  2198.     printf("port closed: %d\n.",cport->clientconfig.IDNumber);
  2199. #endif
  2200. //    Exit(0);
  2201. }
  2202.  
  2203.  
  2204. void StartGUI()
  2205. {
  2206.     char error=FALSE;
  2207.     struct PortData *mport=(PortData *)MainTask->tc_UserData;
  2208.     char buffer[200];
  2209.     struct TagItem GUIProcTagList[] =
  2210.     {
  2211.         {    NP_Entry,        (ULONG)gui_main},
  2212.         {    NP_Name,            (ULONG)"novia_gui"},
  2213.         {    NP_StackSize,    20000},
  2214.         {    TAG_DONE,        TAG_DONE},
  2215.     };
  2216.     guifrontend.mport=mport;
  2217.     if ((GUITask=(Task *)CreateNewProc(GUIProcTagList)))
  2218.     {
  2219.         GUITask->tc_UserData=&guifrontend;
  2220.         guifrontend.GUIOpen=TRUE;
  2221.     }
  2222. }
  2223.  
  2224.  
  2225.  
  2226. void nrc_start()
  2227. {
  2228.     struct TagItem NRCProcTagList[] =
  2229.     {
  2230.         {    NP_Entry,        (ULONG)nrc_main},
  2231.         {    NP_Name,            (ULONG)"novia_nrc_server"},
  2232.         {    NP_StackSize,    20000},
  2233.         {    TAG_DONE,        TAG_DONE},
  2234.     };
  2235.     CreateNewProc(NRCProcTagList);
  2236. }
  2237.  
  2238. void nfs_start()
  2239. {
  2240.     struct TagItem NFSProcTagList[] =
  2241.     {
  2242.         {    NP_Entry,        (ULONG)nfs_main},
  2243.         {    NP_Name,            (ULONG)"novia_nfs_server"},
  2244.         {    NP_StackSize,    20000},
  2245.         {    TAG_DONE,        TAG_DONE},
  2246.     };
  2247.     ioprintf("starting Novia File Server");
  2248.     CreateNewProc(NFSProcTagList);
  2249.     while (!nfsserver)
  2250.         Delay(2);
  2251.     CR(); ioprintf("Cc2donec7\n");
  2252. }
  2253.  
  2254.  
  2255. void LoadEvents()
  2256. {
  2257.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  2258.     char *buffer;
  2259.     BPTR mulder;
  2260.     if ((buffer=AllocVec(1024,MEMF_ANY|MEMF_CLEAR)))
  2261.     {
  2262.         sprintf(buffer,"%ssys.events",cport->sysdirs->sysdata);
  2263.         if ((mulder=Open(buffer,MODE_OLDFILE)))
  2264.         {
  2265.             struct Event *event;
  2266.             char quit=FALSE;
  2267.             ULONG strlength;
  2268.             char start=FALSE;
  2269.             ULONG    linecounter=1;
  2270.  
  2271.             while (!quit && FGets(mulder,buffer,1023)) // Nicht 1024, wegen eines Bugs in der dos.library V37
  2272.             {
  2273.                 strlength=strlen(buffer);
  2274.                 if (searchstr(buffer,"STARTEVENT"))
  2275.                 {
  2276.                     if (!start)
  2277.                     {
  2278.                         start=TRUE;
  2279.                         if ((event=AllocVec(sizeof(Event),MEMF_ANY|MEMF_CLEAR)))
  2280.                         {
  2281.                             event->Multiplicator= MULTIPLICATOR_MINS;
  2282.                         }
  2283.                         else
  2284.                         {
  2285.                             quit=TRUE;
  2286.                         }
  2287.                     }
  2288.                     else
  2289.                     {
  2290.                         printf("eventlist error in line %d, STARTEVENT.",linecounter);
  2291.                     }
  2292.                 }
  2293.                 if (searchstr(buffer,"ENDEVENT"))
  2294.                 {
  2295.                     if (start)
  2296.                     {
  2297.                         event->Status=TRUE;
  2298.                         AddTail((List *)&mainportconfig->EventList,(Node *)event);
  2299.                         start=FALSE;
  2300.                     }
  2301.                     else
  2302.                     {
  2303.                         printf("eventlist error in line %d, END.",linecounter);
  2304.                     }
  2305.                 }
  2306.                 if (searchstr(buffer,"INTERVALTIME="))
  2307.                 {
  2308.                     if (start)
  2309.                     {
  2310.                         ULONG ulong;
  2311.                         char *pos=&buffer[12];
  2312.                         while ((*pos<'0' | *pos>'9') && *pos)
  2313.                             pos++;
  2314.                         StrToLong(pos,(LONG *)&ulong);
  2315.                         event->IntervalTime=ulong;
  2316.                     }
  2317.                     else
  2318.                     {
  2319.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2320.                     }
  2321.                 }
  2322.                 if (searchstr(buffer,"INTERVALMULTIPLICATOR="))
  2323.                 {
  2324.                     if (start)
  2325.                     {
  2326.                         if (searchstr(buffer,"SECS"))
  2327.                             event->Multiplicator=MULTIPLICATOR_SECS;
  2328.                         if (searchstr(buffer,"MINS"))
  2329.                             event->Multiplicator=MULTIPLICATOR_MINS;
  2330.                         if (searchstr(buffer,"HOURS"))
  2331.                             event->Multiplicator=MULTIPLICATOR_HOURS;
  2332.                         if (searchstr(buffer,"DAYS"))
  2333.                             event->Multiplicator=MULTIPLICATOR_DAYS;
  2334.                     }
  2335.                     else
  2336.                     {
  2337.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2338.                     }
  2339.                 }
  2340.                 if (searchstr(buffer,"EVENTNAME="))
  2341.                 {
  2342.                     if (start)
  2343.                     {
  2344.                         mystrcpy(event->Name,buffer,20)
  2345.                     }
  2346.                     else
  2347.                     {
  2348.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2349.                     }
  2350.                 }
  2351.                 if (searchstr(buffer,"BEGINDATE="))
  2352.                 {
  2353.                     if (start)
  2354.                     {
  2355.                         if (event->EndDate.datecode==0)
  2356.                         {
  2357.                             ULONG ulong;
  2358.                             char *pos=&buffer[4];
  2359.                             StringToDate(pos,&event->BeginDate,0);
  2360.                         }
  2361.                         else
  2362.                             printf("eventlist error in line %d, BEGINDATE alread set.\n",linecounter);                    
  2363.                     }
  2364.                     else
  2365.                     {
  2366.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2367.                     }
  2368.                 }
  2369.                 if (searchstr(buffer,"ENDDATE="))
  2370.                 {
  2371.                     if (start)
  2372.                     {
  2373.                         if (event->EndDate.datecode==0)
  2374.                         {
  2375.                             ULONG ulong;
  2376.                             char *pos=&buffer[4];
  2377.                             StringToDate(pos,&event->EndDate,0);
  2378.                         }
  2379.                         else
  2380.                             printf("eventlist error in line %d, ENDDATE alread set.\n",linecounter);
  2381.                     }
  2382.                     else
  2383.                     {
  2384.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2385.                     }
  2386.                 }
  2387.                 if (searchstr(buffer,"BEGINTIME="))
  2388.                 {
  2389.                     if (start)
  2390.                     {
  2391.                         struct Date mydate;
  2392.                         ULONG ulong;
  2393.                         char *pos=&buffer[10];
  2394.                         StringToDate(pos,&mydate,0);
  2395.                         event->BeginDate.hours=mydate.hours;
  2396.                         event->BeginDate.mins=mydate.mins;
  2397.                         event->BeginDate.secs=mydate.secs;
  2398.                         CalcDatecode(&event->BeginDate);
  2399.                         DateToString(buffer,&mydate,0);
  2400.                     }
  2401.                     else
  2402.                     {
  2403.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2404.                     }
  2405.                 }
  2406.                 if (searchstr(buffer,"ENDTIME="))
  2407.                 {
  2408.                     if (start)
  2409.                     {
  2410.                         struct Date mydate;
  2411.                         ULONG ulong;
  2412.                         char *pos=&buffer[8];
  2413.                         StringToDate(pos,&mydate,0);
  2414.                         event->EndDate.hours=mydate.hours;
  2415.                         event->EndDate.mins=mydate.mins;
  2416.                         event->EndDate.secs=mydate.secs;
  2417.                         CalcDatecode(&event->EndDate);
  2418.                     }
  2419.                     else
  2420.                     {
  2421.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2422.                     }
  2423.                 }
  2424.                 if (searchstr(buffer,"DATETYPE="))
  2425.                 {
  2426.                     if (start)
  2427.                     {
  2428.                         if (searchstr(buffer,"DATE"))
  2429.                             event->DateType=0;
  2430.                         if (searchstr(buffer,"SPACE"))
  2431.                             event->DateType=1;
  2432.                         if (searchstr(buffer,"MONTH"))
  2433.                             event->DateType=2;
  2434.                         if (searchstr(buffer,"DIALY"))
  2435.                             event->DateType=3;
  2436.                     }
  2437.                     else
  2438.                     {
  2439.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2440.                     }
  2441.                 }
  2442.                 if (searchstr(buffer,"USEINTERVAL="))
  2443.                 {
  2444.                     if (start)
  2445.                     {
  2446.                         if (searchstr(buffer,"TRUE"))
  2447.                             event->UseInterval=TRUE;
  2448.                     }
  2449.                     else
  2450.                     {
  2451.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2452.                     }
  2453.                 }
  2454.                 if (searchstr(buffer,"HOLIDAYS="))
  2455.                 {
  2456.                     if (start)
  2457.                     {
  2458.                         if (searchstr(buffer,"ONLY"))
  2459.                             event->Holiday=1;
  2460.                         else
  2461.                             if (searchstr(buffer,"DONOTHING"))
  2462.                                 event->Holiday=2;
  2463.                     }
  2464.                     else
  2465.                     {
  2466.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2467.                     }
  2468.                 }
  2469.                 if (searchstr(buffer,"WEEKDAYS="))
  2470.                 {
  2471.                     if (start)
  2472.                     {
  2473.                         if (searchstr(buffer,"MON"))
  2474.                             event->weekday[0]=TRUE;
  2475.                         if (searchstr(buffer,"THU"))
  2476.                             event->weekday[1]=TRUE;
  2477.                         if (searchstr(buffer,"WEN"))
  2478.                             event->weekday[2]=TRUE;
  2479.                         if (searchstr(buffer,"TUR"))
  2480.                             event->weekday[3]=TRUE;
  2481.                         if (searchstr(buffer,"FRI"))
  2482.                             event->weekday[4]=TRUE;
  2483.                         if (searchstr(buffer,"SAT"))
  2484.                             event->weekday[5]=TRUE;
  2485.                         if (searchstr(buffer,"SUN"))
  2486.                             event->weekday[6]=TRUE;
  2487.                     }
  2488.                     else
  2489.                     {
  2490.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2491.                     }
  2492.                 }
  2493.                 if (searchstr(buffer,"USEWEEKDAYS="))
  2494.                 {
  2495.                     if (start)
  2496.                     {
  2497.                         if (searchstr(buffer,"TRUE"))
  2498.                             event->UseWeekday=TRUE;
  2499.                     }
  2500.                     else
  2501.                     {
  2502.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2503.                     }
  2504.                 }
  2505.                 if (searchstr(buffer,"MONTH"))
  2506.                 {
  2507.                     if (start)
  2508.                     {
  2509.                         if (searchstr(buffer,"JAN"))
  2510.                             event->month[0]=TRUE;
  2511.                         if (searchstr(buffer,"FEB"))
  2512.                             event->month[1]=TRUE;
  2513.                         if (searchstr(buffer,"MRZ"))
  2514.                             event->month[2]=TRUE;
  2515.                         if (searchstr(buffer,"APR"))
  2516.                             event->month[3]=TRUE;
  2517.                         if (searchstr(buffer,"MAY"))
  2518.                             event->month[4]=TRUE;
  2519.                         if (searchstr(buffer,"JUN"))
  2520.                             event->month[5]=TRUE;
  2521.                         if (searchstr(buffer,"JUL"))
  2522.                             event->month[6]=TRUE;
  2523.                         if (searchstr(buffer,"AUG"))
  2524.                             event->month[7]=TRUE;
  2525.                         if (searchstr(buffer,"SEP"))
  2526.                             event->month[8]=TRUE;
  2527.                         if (searchstr(buffer,"OCT"))
  2528.                             event->month[9]=TRUE;
  2529.                         if (searchstr(buffer,"NOV"))
  2530.                             event->month[10]=TRUE;
  2531.                         if (searchstr(buffer,"DEC"))
  2532.                             event->month[11]=TRUE;
  2533.                     }
  2534.                     else
  2535.                     {
  2536.                         printf("eventlist error in line %d, STARTEVENT fails.",linecounter);
  2537.                     }
  2538.                 }
  2539.                 linecounter++;
  2540.             }
  2541.             Close(mulder);
  2542.         }
  2543.         else
  2544.         {
  2545.             printf("can't load eventlist. unable to open %s.\n",buffer);
  2546.         }
  2547.     }
  2548.     else
  2549.     {
  2550.         printf("can't open ENVARC:novia_mainportconfig.\n");
  2551.     }
  2552. }
  2553.     
  2554.  
  2555.  
  2556. void SaveEvents()
  2557. {
  2558.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  2559.     char buffer[200];
  2560.     BPTR mulder;
  2561.     sprintf(buffer,"%ssys.events",cport->sysdirs->sysdata);
  2562.     if ((mulder=Open(buffer,MODE_NEWFILE)))
  2563.     {
  2564.         struct Event *event=(Event *)mainportconfig->EventList.mlh_Head;
  2565.         while (event->ln_Succ)
  2566.         {
  2567.             sprintf(buffer,"STARTEVENT\n");
  2568.             FPuts(mulder,buffer);
  2569.             sprintf(buffer,"EVENTNAME=%s\n",event->Name);
  2570.             FPuts(mulder,buffer);
  2571.  
  2572.             if (event->BeginDate.year|event->BeginDate.month|event->BeginDate.day)
  2573.             {
  2574.                 struct Date *d=&event->BeginDate;
  2575.                 DateToString(&buffer[100],d,DATEFLAG_USEDATE);
  2576.                 sprintf(buffer,"BEGINDATE=%s\n",&buffer[100]);
  2577.                 FPuts(mulder,buffer);
  2578.             }
  2579.  
  2580.             if (event->EndDate.year|event->EndDate.month|event->EndDate.day)
  2581.             {
  2582.                 struct Date *d=&event->EndDate;
  2583.                 DateToString(&buffer[100],d,DATEFLAG_USEDATE);
  2584.                 sprintf(buffer,"ENDDATE=%s\n",&buffer[100]);
  2585.                 FPuts(mulder,buffer);
  2586.             }
  2587.  
  2588.             if (event->IntervalTime)
  2589.             {
  2590.                 sprintf(buffer,"INTERVALTIME=%d\n",event->IntervalTime);
  2591.                 FPuts(mulder,buffer);
  2592.             }
  2593.  
  2594.             switch (event->Multiplicator)
  2595.             {
  2596.                 case MULTIPLICATOR_SECS:
  2597.                     FPuts(mulder,"INTERVALMULTIPLICATOR=SECS\n");
  2598.                     break;
  2599.                 case MULTIPLICATOR_MINS:
  2600.                     FPuts(mulder,"INTERVALMULTIPLICATOR=MINS\n");
  2601.                     break;
  2602.                 case MULTIPLICATOR_HOURS:
  2603.                     FPuts(mulder,"INTERVALMULTIPLICATOR=HOURS\n");
  2604.                     break;
  2605.                 case MULTIPLICATOR_DAYS:
  2606.                     FPuts(mulder,"INTERVALMULTIPLICATOR=DAYS\n");
  2607.                     break;
  2608.             }
  2609.  
  2610.             DateToString(&buffer[100],&event->BeginDate,DATEFLAG_USETIME);
  2611.             sprintf(buffer,"BEGINTIME=%s\n",&buffer[100]);
  2612.             FPuts(mulder,buffer);
  2613.  
  2614.             DateToString(&buffer[100],&event->EndDate,DATEFLAG_USETIME);
  2615.             sprintf(buffer,"ENDTIME=%s\n",&buffer[100]);
  2616.             FPuts(mulder,buffer);
  2617.  
  2618.             sprintf(buffer,"DATETYPE=");
  2619.             switch(event->DateType)
  2620.             {
  2621.                 case 0:
  2622.                     strcat(buffer,"DATE");
  2623.                     break;
  2624.                 case 1:
  2625.                     strcat(buffer,"SPACE");
  2626.                     break;
  2627.                 case 2:
  2628.                     strcat(buffer,"MONTH");
  2629.                     break;
  2630.                 case 3:
  2631.                     strcat(buffer,"DAILY");
  2632.                     break;
  2633.             }
  2634.             strcat(buffer,"\n");
  2635.             FPuts(mulder,buffer);
  2636.  
  2637.             if (event->UseInterval)
  2638.                 FPuts(mulder,"USEINTERVAL=TRUE\n");
  2639.             else
  2640.                 FPuts(mulder,"USEINTERVAL=FALSE\n");
  2641.  
  2642.             if (event->Holiday==1)
  2643.                 FPuts(mulder,"HOLIDAYS=ONLY\n");
  2644.             else
  2645.                 if (event->Holiday==2)
  2646.                     FPuts(mulder,"HOLIDAYS=DONOTHING\n");
  2647.  
  2648.                 strcpy(buffer,"WEEKDAYS=");
  2649.             if (event->weekday[0])
  2650.                 strcat(buffer,"MON ");
  2651.             if (event->weekday[1])
  2652.                 strcat(buffer,"THU ");
  2653.             if (event->weekday[2])
  2654.                 strcat(buffer,"WEN ");
  2655.             if (event->weekday[3])
  2656.                 strcat(buffer,"TUR ");
  2657.             if (event->weekday[4])
  2658.                 strcat(buffer,"FRI ");
  2659.             if (event->weekday[5])
  2660.                 strcat(buffer,"SAT ");
  2661.             if (event->weekday[6])
  2662.                 strcat(buffer,"SUN ");
  2663.             if (strlen(buffer)>9)
  2664.             {
  2665.                 strcat(buffer,"\n");
  2666.                 FPuts(mulder,buffer);
  2667.             }
  2668.  
  2669.             if (event->UseWeekday)
  2670.                 FPuts(mulder,"USEWEEKDAYS=TRUE\n");
  2671.             else
  2672.                 FPuts(mulder,"USEWEEKDAYS=FALSE\n");
  2673.  
  2674.  
  2675.             strcpy(buffer,"MONTH=");
  2676.             if (event->month[0])
  2677.                 strcat(buffer,"JAN ");
  2678.             if (event->month[1])
  2679.                 strcat(buffer,"FEB ");
  2680.             if (event->month[2])
  2681.                 strcat(buffer,"MRZ ");
  2682.             if (event->month[3])
  2683.                 strcat(buffer,"APR ");
  2684.             if (event->month[4])
  2685.                 strcat(buffer,"MAY ");
  2686.             if (event->month[5])
  2687.                 strcat(buffer,"JUN ");
  2688.             if (event->month[6])
  2689.                 strcat(buffer,"JUL ");
  2690.             if (event->month[7])
  2691.                 strcat(buffer,"AUG ");
  2692.             if (event->month[8])
  2693.                 strcat(buffer,"SEP ");
  2694.             if (event->month[9])
  2695.                 strcat(buffer,"OCT ");
  2696.             if (event->month[10])
  2697.                 strcat(buffer,"NOV ");
  2698.             if (event->month[11])
  2699.                 strcat(buffer,"DEC ");
  2700.             if (strlen(buffer)>6)
  2701.             {
  2702.                 strcat(buffer,"\n");
  2703.                 FPuts(mulder,buffer);
  2704.             }
  2705.  
  2706.             strcpy(buffer,"EVENTTYPE=");
  2707.             if (event->EventType==0)
  2708.                 strcat(buffer,"NOVIA");
  2709.             if (event->EventType==1)
  2710.                 strcat(buffer,"DOS");
  2711.             if (event->EventType==2)
  2712.                 strcat(buffer,"AREXX");
  2713.             strcat(buffer,"\n");
  2714.  
  2715.             FPuts(mulder,buffer);
  2716.  
  2717.             FPuts(mulder,"ENDEVENT\n\n");
  2718.  
  2719.             event=event->ln_Succ;
  2720.         }
  2721.         Close(mulder);
  2722.     }
  2723.     else
  2724.     printf("can't open %s\n",buffer);
  2725. }
  2726.  
  2727.  
  2728. void LoadMailServers()
  2729. {
  2730.     struct PortData *cport=(PortData *)MainTask->tc_UserData;
  2731.     char *buffer;
  2732.     BPTR mulder;
  2733.  
  2734.     NewList((List *)&mainportconfig->POP3ServerList);
  2735.     NewList((List *)&mainportconfig->LocalMailServerList);
  2736.  
  2737.     if ((buffer=AllocVec(1024,MEMF_ANY|MEMF_CLEAR)))
  2738.     {
  2739.         sprintf(buffer,"%ssys.uucp_localmail_servers",mainportconfig->sysdirs.sysdata);
  2740.         if ((mulder = Open(buffer,MODE_OLDFILE)))
  2741.         {
  2742.             struct INet_LocalMailServer *server=NULL;
  2743.             struct INet_MailUser *user=NULL;
  2744.             char quit=FALSE;
  2745.             ULONG strlength;
  2746.             char start=FALSE;
  2747.             ULONG    linecounter=1;
  2748.  
  2749.             while (!quit && FGets(mulder,buffer,1023)) // Nicht 1024, wegen eines Bugs in der dos.library V37
  2750.             {
  2751.                 strlength=strlen(buffer);
  2752.                 if (searchstr(buffer,"STARTSERVER"))
  2753.                 {
  2754.                     if (!start)
  2755.                     {
  2756.                         start=TRUE;
  2757.                         if ((server=AllocVec(sizeof(INet_LocalMailServer),MEMF_ANY|MEMF_CLEAR)))
  2758.                         {
  2759.                             NewList((List *)&server->Users);
  2760.                         }
  2761.                         
  2762.                         else
  2763.                         {
  2764.                             quit=TRUE;
  2765.                         }
  2766.                     }
  2767.                     else
  2768.                     {
  2769.                         printf("localmainserverlist error in line %d, STARTSERVER ALREADY.\n",linecounter);
  2770.                     }
  2771.                 }
  2772.                 if (start)
  2773.                 {
  2774.                     if (searchstr(buffer,"NAME"))
  2775.                     {
  2776.                         if (searchstr(buffer,"UserName"))
  2777.                         {
  2778.                             if (searchstr(buffer,"Flag"))
  2779.                             {
  2780.                             }
  2781.                             else
  2782.                             {
  2783.                                 if (user)
  2784.                                 {
  2785.                                     mystrcpy(user->Name,buffer,40)
  2786.                                 }
  2787.                                 else
  2788.                                 {
  2789.                                     printf("localmainserverlist error in line %d, Name STARTUSER.\n",linecounter);
  2790.                                 }
  2791.                             }
  2792.                         }
  2793.                         else
  2794.                         {
  2795.                             if (searchstr(buffer,"INVALIDFILENAME"))
  2796.                             {
  2797.                                 mystrcpy(server->InvalidFilename,buffer,120)
  2798.                             }
  2799.                             else
  2800.                             {
  2801.                                 mystrcpy(server->Name,buffer,40);
  2802.                             }
  2803.                         }
  2804.                     }
  2805.                     if (searchstr(buffer,"DOMAIN"))
  2806.                     {
  2807.                         mystrcpy(server->Domain,buffer,40)
  2808.                     }
  2809.                     if (searchstr(buffer,"SMTPHOST"))
  2810.                     {
  2811.                         char *pos=&buffer[8];
  2812.                         char newpos=0;
  2813.                         ULONG ulong;
  2814.                         while (*pos && *pos!=' ' && *pos!='=' && *pos!=':')
  2815.                             pos++;
  2816.                         pos++;
  2817.                         while (*pos && *pos!=':' && newpos<40)
  2818.                         {
  2819.                             server->SMTPHost[newpos]=*pos;
  2820.                             newpos++;
  2821.                             pos++;
  2822.                         }
  2823.                         if (*pos==':')
  2824.                         {
  2825.                             StrToLong(pos+1,(LONG *)&ulong);
  2826.                             server->SMTPPort=(UWORD)ulong;
  2827.                         }
  2828.                     }
  2829.                     if (searchstr(buffer,"POP3HOST"))
  2830.                     {
  2831.                         char *pos=&buffer[8];
  2832.                         char newpos=0;
  2833.                         ULONG ulong;
  2834.                         while (*pos && *pos!=' ' && *pos!='=' && *pos!=':')
  2835.                             pos++;
  2836.                         pos++;
  2837.                         while (*pos && *pos!=':' && newpos<40)
  2838.                         {
  2839.                             server->POP3Host[newpos]=*pos;
  2840.                             newpos++;
  2841.                             pos++;
  2842.                         }
  2843.                         if (*pos==':')
  2844.                         {
  2845.                             StrToLong(pos+1,(LONG *)&ulong);
  2846.                             server->POP3Port=(UWORD)ulong;
  2847.                         }
  2848.                     }
  2849.                     if (searchstr(buffer,"FLAGS"))
  2850.                     {
  2851.                         if (searchstr(buffer,"USERFLAGS"))
  2852.                         {
  2853.                             if (user)
  2854.                             {
  2855.                                 if (searchstr(buffer,"UseBBSUserName"))
  2856.                                     user->Flag_UseBBSUserName=TRUE;
  2857.                                 if (searchstr(buffer,"UseBBSPassword"))
  2858.                                     user->Flag_UseBBSPassword=TRUE;
  2859.                             }
  2860.                         }
  2861.                         else
  2862.                         {
  2863.                             if (searchstr(buffer,"Allow8Bit"))
  2864.                             {
  2865.                                 server->Flag_Allow8Bit=TRUE;
  2866.                             }
  2867.                             if (searchstr(buffer,"UseAPOP"))
  2868.                             {
  2869.                                 server->Flag_UseAPOP=TRUE;
  2870.                             }
  2871.                             if (searchstr(buffer,"ExternalServer"))
  2872.                             {
  2873.                                 server->Flag_ExternalServer=TRUE;
  2874.                             }
  2875.                         }
  2876.                     }
  2877.                     if (searchstr(buffer,"INVALIDMAILSUBJECT"))
  2878.                     {
  2879.                         mystrcpy(server->InvalidMailSubject,buffer,80)
  2880.                     }
  2881.                     if (searchstr(buffer,"INVALIDADDRESS"))
  2882.                     {
  2883.                         mystrcpy(server->InvalidAddress,buffer,80)
  2884.                     }
  2885.                     if (searchstr(buffer,"INBOUND"))
  2886.                     {
  2887.                         mystrcpy(server->InboundPath,buffer,80)
  2888.                     }
  2889.                     if (searchstr(buffer,"OUTBOUND"))
  2890.                     {
  2891.                         mystrcpy(server->OutboundPath,buffer,70)
  2892.                     }
  2893.                     if (searchstr(buffer,"STARTUSER"))
  2894.                     {
  2895.                         if (user)
  2896.                         {
  2897.                             printf("localmainserverlist error in line %d, STARTUSER.\n",linecounter);                            
  2898.                         }
  2899.                         else
  2900.                         {
  2901.                             if ((user=AllocVec(sizeof(INet_MailUser),MEMF_ANY|MEMF_CLEAR)))
  2902.                             {
  2903.                             }
  2904.                             else
  2905.                                 quit=TRUE;
  2906.                         }
  2907.                     }
  2908.                     if (searchstr(buffer,"IPNumber"))
  2909.                     {
  2910.                         if (user)
  2911.                         {
  2912.                             char *pos=&buffer[8];
  2913.                             while ((*pos<'0' | *pos>'9') && *pos)
  2914.                                 pos++;
  2915.                             StrToLong(pos+1,(LONG *)&user->IPNumber);
  2916.                         }
  2917.                         else
  2918.                         {
  2919.                             printf("localmainserverlist error in line %d, IPNumber STARTUSER.\n",linecounter);
  2920.                         }
  2921.                     }
  2922.                     if (searchstr(buffer,"EXTERNALUSER"))
  2923.                     {
  2924.                         if (user)
  2925.                             user->UserType=1;
  2926.                     }
  2927.                     if (searchstr(buffer,"POPID"))
  2928.                     {
  2929.                         if (user)
  2930.                         {
  2931.                             mystrcpy(user->POPID,buffer,40)
  2932.                         }
  2933.                         else
  2934.                         {
  2935.                             printf("localmainserverlist error in line %d, POPID STARTUSER.\n",linecounter);
  2936.                         }
  2937.                     }
  2938.                     if (searchstr(buffer,"POPPASSWORD"))
  2939.                     {
  2940.                         if (user)
  2941.                         {
  2942.                             mystrcpy(user->POPPassword,buffer,40)
  2943.                         }
  2944.                         else
  2945.                         {
  2946.                             printf("localmainserverlist error in line %d, POPPASSWORD STARTUSER.\n",linecounter);
  2947.                         }
  2948.                     }
  2949.                     if (searchstr(buffer,"HOLDMAILS"))
  2950.                     {
  2951.                         if (user)
  2952.                         {
  2953.                             ULONG ulong;
  2954.                             char *pos=&buffer[9];
  2955.                             while ((*pos<'0' | *pos>'9') && *pos)
  2956.                                 pos++;
  2957.                             StrToLong(pos,(LONG *)&ulong);
  2958.                             user->HoldMails=(UWORD)ulong;
  2959.                         }
  2960.                         else
  2961.                         {
  2962.                             printf("localmainserverlist error in line %d, HOLDMAILS STARTUSER.\n",linecounter);
  2963.                         }
  2964.                     }
  2965.                     if (searchstr(buffer,"MaxEMails"))
  2966.                     {
  2967.                         if (user)
  2968.                         {
  2969.                             ULONG ulong;
  2970.                             char *pos=&buffer[9];
  2971.                             while ((*pos<'0' | *pos>'9') && *pos)
  2972.                                 pos++;
  2973.                             StrToLong(pos,(LONG *)&ulong);
  2974.                             user->MaxEMails=(UWORD)ulong;
  2975.                         }
  2976.                         else
  2977.                         {
  2978.                             printf("localmainserverlist error in line %d, MaxEMails STARTUSER.\n",linecounter);
  2979.                         }
  2980.                     }
  2981.                     if (searchstr(buffer,"MailBoxSpace"))
  2982.                     {
  2983.                         if (user)
  2984.                         {
  2985.                             char *pos=&buffer[9];
  2986.                             while ((*pos<'0' | *pos>'9') && *pos)
  2987.                                 pos++;
  2988.                             StrToLong(pos,(LONG *)&user->Space);
  2989.                         }
  2990.                         else
  2991.                         {
  2992.                             printf("localmainserverlist error in line %d, MailBoxSpace STARTUSER.\n",linecounter);
  2993.                         }
  2994.                     }
  2995.                 }
  2996.                 if (searchstr(buffer,"END"))
  2997.                 {
  2998.                     if (start)
  2999.                     {
  3000.                         if (searchstr(buffer,"ENDUSER"))
  3001.                         {
  3002.                             if (user)
  3003.                             {
  3004.                                 AddTail((List *)&server->Users,(Node *)user);
  3005.                                 user=NULL;
  3006.                             }
  3007.                             else
  3008.                             {
  3009.                                 printf("localmainserverlist error in line %d, END STARTUSER.\n",linecounter);
  3010.                             }
  3011.                         }
  3012.                         else
  3013.                         {                    
  3014.                             server->Status=TRUE;
  3015.                             AddTail((List *)&mainportconfig->LocalMailServerList,(Node *)server);
  3016.                             start=FALSE;
  3017.                             if (user)
  3018.                             {
  3019.                                 AddTail((List *)&server->Users,(Node *)user);
  3020.                                 user=NULL;
  3021.                             }
  3022.                         }
  3023.                     }
  3024.                     else
  3025.                     {
  3026.                         printf("localmailserverlist error in line %d, END.\n",linecounter);
  3027.                     }
  3028.                 }
  3029.                 linecounter++;
  3030.             }
  3031.             Close(mulder);
  3032.         }
  3033.         else
  3034.         {
  3035.             printf("can't load localmailserverlist. unable to open %s.\n",buffer);
  3036.         }
  3037.  
  3038.         sprintf(buffer,"%ssys.uucp_pop3_servers",mainportconfig->sysdirs.sysdata);
  3039.         if ((mulder = Open(buffer, MODE_OLDFILE)))
  3040.         {
  3041.             struct INet_POP3Server *server=NULL;
  3042.             char quit=FALSE;
  3043.             ULONG strlength;
  3044.             char start = FALSE;
  3045.             ULONG    linecounter=1;
  3046.  
  3047.             while (!quit && FGets(mulder,buffer,1023)) // Nicht 1024, wegen eines Bugs in der dos.library V37
  3048.             {
  3049.                 strlength = strlen(buffer);
  3050.                 if (!start)
  3051.                 {
  3052.                     if (searchstr(buffer, "STARTSERVER"))
  3053.                     {
  3054.                         if (!start)
  3055.                         {
  3056.                             if ((server = AllocVec(sizeof(struct INet_POP3Server), MEMF_ANY | MEMF_CLEAR)))
  3057.                             {
  3058.                                 start = TRUE;
  3059.                             }
  3060.                             else
  3061.                             {
  3062.                                 quit=TRUE;
  3063.                             }
  3064.                         }
  3065.                         else
  3066.                         {
  3067.                             printf("pop3mainserverlist error in line %d, STARTSERVER ALREADY.\n",linecounter);
  3068.                         }
  3069.                     }
  3070.                 }
  3071.                 if (start)
  3072.                 {
  3073.                     if (searchstr(buffer,"NAME"))
  3074.                     {
  3075.                         if (searchstr(buffer,"INVALIDFILENAME"))
  3076.                         {
  3077.                             mystrcpy(server->InvalidFilename,buffer,120)
  3078.                         }
  3079.                         else
  3080.                         {
  3081.                             mystrcpy(server->Name,buffer,40);
  3082.                         }
  3083.                     }
  3084.                     if (searchstr(buffer,"USER"))
  3085.                     {
  3086.                         mystrcpy(server->Username,buffer,80);                        
  3087.                     }
  3088.                     if (searchstr(buffer,"PASSWORD"))
  3089.                     {
  3090.                         mystrcpy(server->Password,buffer,80);                        
  3091.                     }
  3092.                     if (searchstr(buffer,"DOMAIN"))
  3093.                     {
  3094.                         mystrcpy(server->Domain,buffer,120)
  3095.                     }
  3096.                     if (searchstr(buffer,"SMTPHOST"))
  3097.                     {
  3098.                         mystrcpy(server->SMTPHost,buffer,80)
  3099.                     }
  3100.                     if (searchstr(buffer,"POP3HOST"))
  3101.                     {
  3102.                         mystrcpy(server->POP3Host,buffer,80)
  3103.                     }
  3104.                     if (searchstr(buffer,"FLAGS"))
  3105.                     {
  3106.                         {
  3107.                             if (searchstr(buffer,"8Bit"))
  3108.                             {
  3109.                                 server->Flag_8Bit=TRUE;
  3110.                             }
  3111.                             if (searchstr(buffer,"UseAPOP"))
  3112.                             {
  3113.                                 server->Flag_UseAPOP=TRUE;
  3114.                             }
  3115.                             if (searchstr(buffer,"ExternalServer"))
  3116.                             {
  3117.                                 server->Flag_ExternalServer=TRUE;
  3118.                             }
  3119.                             if (searchstr(buffer,"DeleteMails"))
  3120.                             {
  3121.                                 server->Flag_DeleteMails=TRUE;
  3122.                             }
  3123.                         }
  3124.                     }
  3125.                     if (searchstr(buffer,"INVALIDMAILSUBJECT"))
  3126.                     {
  3127.                         mystrcpy(server->InvalidMailSubject,buffer,80)
  3128.                     }
  3129.                     if (searchstr(buffer,"INVALIDADDRESS"))
  3130.                     {
  3131.                         mystrcpy(server->InvalidAddress,buffer,80)
  3132.                     }
  3133.                     if (searchstr(buffer,"INBOUND"))
  3134.                     {
  3135.                         mystrcpy(server->InboundPath,buffer,80)
  3136.                     }
  3137.                     if (searchstr(buffer,"OUTBOUND"))
  3138.                     {
  3139.                         mystrcpy(server->OutboundPath,buffer,80)
  3140.                     }
  3141.                     if (searchstr(buffer,"END"))
  3142.                     {
  3143.                         server->Status = TRUE;
  3144.                         AddTail((List *)&mainportconfig->POP3ServerList,(Node *)server);
  3145.                         start = FALSE;
  3146.                     }
  3147.                 }
  3148.                 ClearMemQuick(buffer,100);
  3149.                 linecounter++;
  3150.             }
  3151.             Close(mulder);
  3152.         }
  3153.         else
  3154.         {
  3155.             printf("can't load pop3_mailserverlist. unable to open %s.\n",buffer);
  3156.         }
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.         FreeVec(buffer);
  3163.     }
  3164.     else
  3165.     {
  3166.         printf("can't open ENVARC:novia_mainportconfig.\n");
  3167.     }
  3168.  
  3169.  
  3170.  
  3171. }
  3172.  
  3173. void SaveMailServers()
  3174. {
  3175.     char buffer[200];
  3176.     BPTR mulder;
  3177.     INet_LocalMailServer *server=NULL;
  3178.     INet_POP3Server *popserver=NULL;
  3179.  
  3180.     sprintf(buffer,"%ssys.uucp_localmail_servers",mainportconfig->sysdirs.sysdata);
  3181.     if ((mulder=Open(buffer,MODE_NEWFILE)))
  3182.     {
  3183.         struct INet_MailUser *user;
  3184.         server=(INet_LocalMailServer *)mainportconfig->LocalMailServerList.mlh_Head;
  3185.         while (server->ln_Succ)
  3186.         {
  3187.             sprintf(buffer,"STARTSERVER (%d)\n",server->IDNumber);
  3188.             FPuts(mulder,buffer);
  3189.  
  3190.             sprintf(buffer,"    NAME=%s\n",server->Name);
  3191.             FPuts(mulder,buffer);
  3192.  
  3193.             sprintf(buffer,"    STATUS=%d\n",server->Status);
  3194.             FPuts(mulder,buffer);
  3195.  
  3196.             sprintf(buffer,"    DOMAIN=%s\n",server->Domain);
  3197.             FPuts(mulder,buffer);
  3198.  
  3199.             sprintf(buffer,"    SMTPHOST=%s:%d\n",server->SMTPHost,server->SMTPPort);
  3200.             FPuts(mulder,buffer);
  3201.  
  3202.             sprintf(buffer,"    POP3HOST=%s:%d\n",server->POP3Host,server->POP3Port);
  3203.             FPuts(mulder,buffer);
  3204.  
  3205.             FPuts(mulder,"    FLAGS=");
  3206.             if (server->Flag_Allow8Bit)
  3207.                 FPuts(mulder,"ALLOW8BIT ");
  3208.  
  3209.             if (server->Flag_UseAPOP)
  3210.                 FPuts(mulder,"USEAPOP ");
  3211.  
  3212.             if (server->Flag_ExternalServer)
  3213.                 FPuts(mulder,"EXTERNALSERVER");
  3214.  
  3215.             FPuts(mulder,"\n");
  3216.  
  3217.             sprintf(buffer,"    INVALIDMAILSUBJECT=%s\n",server->InvalidMailSubject);
  3218.             FPuts(mulder,buffer);
  3219.  
  3220.             sprintf(buffer,"    INVALIDADDRESS=%s\n",server->InvalidAddress);
  3221.             FPuts(mulder,buffer);
  3222.  
  3223.             sprintf(buffer,"    INVALIDFILENAME=%s\n",server->InvalidFilename);
  3224.             FPuts(mulder,buffer);
  3225.  
  3226.             sprintf(buffer,"    INBOUND=%s\n",server->InboundPath);
  3227.             FPuts(mulder,buffer);
  3228.  
  3229.             sprintf(buffer,"    Outbound=%s\n",server->OutboundPath);
  3230.             FPuts(mulder,buffer);
  3231.  
  3232.             user=(INet_MailUser *)server->Users.mlh_Head;
  3233.             while (user->ln_Succ)
  3234.             {
  3235.                 sprintf(buffer,"\n    STARTUSER (%d)\n",user->IDNumber);
  3236.                 FPuts(mulder,buffer);
  3237.  
  3238.                 sprintf(buffer,"        IPNumber=%d\n",user->IPNumber);
  3239.                 FPuts(mulder,buffer);
  3240.  
  3241.                 if (user->UserType==0)
  3242.                     FPuts(mulder,"        UserType=LOCALUSER\n");
  3243.                 else
  3244.                     FPuts(mulder,"        UserType=EXTERNALUSER\n");
  3245.  
  3246.                 sprintf(buffer,"        UserName=%s\n",user->Name);
  3247.                 FPuts(mulder,buffer);
  3248.  
  3249.                 sprintf(buffer,"        Status=%d\n",user->Status);
  3250.                 FPuts(mulder,buffer);
  3251.  
  3252.                 sprintf(buffer,"        POPID=%s\n",user->POPID);
  3253.                 FPuts(mulder,buffer);
  3254.  
  3255.                 sprintf(buffer,"        POPPASSWORD=%s\n",user->POPPassword);
  3256.                 FPuts(mulder,buffer);
  3257.  
  3258.                 sprintf(buffer,"        HoldMails=%i\n",user->HoldMails);
  3259.                 FPuts(mulder,buffer);
  3260.  
  3261.                 sprintf(buffer,"        MaxEMails=%i\n",user->MaxEMails);
  3262.                 FPuts(mulder,buffer);
  3263.  
  3264.                 sprintf(buffer,"        MailBoxSpace=%i\n",user->Space);
  3265.                 FPuts(mulder,buffer);
  3266.                 
  3267.                 if (user->Flag_UseBBSUserName | user->Flag_UseBBSPassword)
  3268.                 {
  3269.                     strcpy(buffer,"        USERFLAGS=");
  3270.                     if (user->Flag_UseBBSUserName)
  3271.                         strcat(buffer,"UseBBSUserName ");
  3272.                     if (user->Flag_UseBBSPassword)
  3273.                         strcat(buffer,"UseBBSPassword");
  3274.                     strcat(buffer,"\n");
  3275.                     FPuts(mulder,buffer);
  3276.                 }
  3277.  
  3278.  
  3279.                 FPuts(mulder,"    ENDUSER\n");
  3280.  
  3281.                 user=user->ln_Succ;
  3282.             }    
  3283.  
  3284.             FPuts(mulder,"END\n\n");
  3285.             server=server->ln_Succ;
  3286.         }
  3287.         Close(mulder);
  3288.     }
  3289.  
  3290.     sprintf(buffer,"%ssys.uucp_pop3_servers",mainportconfig->sysdirs.sysdata);
  3291.     if ((mulder=Open(buffer,MODE_NEWFILE)))
  3292.     {
  3293.         popserver=(INet_POP3Server *)mainportconfig->POP3ServerList.mlh_Head;
  3294.         while (popserver->ln_Succ)
  3295.         {
  3296.             sprintf(buffer,"STARTSERVER (%d)\n",popserver->IDNumber);
  3297.             FPuts(mulder,buffer);
  3298.  
  3299.             sprintf(buffer,"NAME=%s\n",popserver->Name);
  3300.             FPuts(mulder,buffer);
  3301.  
  3302.             sprintf(buffer,"STATUS=%d\n",popserver->Status);
  3303.             FPuts(mulder,buffer);
  3304.  
  3305.             sprintf(buffer,"DOMAIN=%s\n",popserver->Domain);
  3306.             FPuts(mulder,buffer);
  3307.  
  3308.             sprintf(buffer,"USER=%s\n",popserver->Username);
  3309.             FPuts(mulder,buffer);
  3310.  
  3311.             sprintf(buffer,"PASSWORD=%s\n",popserver->Password);
  3312.             FPuts(mulder,buffer);
  3313.  
  3314.             sprintf(buffer,"SMTPHOST=%s\n",popserver->SMTPHost);
  3315.             FPuts(mulder,buffer);
  3316.  
  3317.             sprintf(buffer,"POP3HOST=%s\n",popserver->POP3Host);
  3318.             FPuts(mulder,buffer);
  3319.  
  3320.             FPuts(mulder,"FLAGS=");
  3321.             if (popserver->Flag_8Bit)
  3322.                 FPuts(mulder,"8BIT ");
  3323.  
  3324.             if (popserver->Flag_UseAPOP)
  3325.                 FPuts(mulder,"USEAPOP ");
  3326.  
  3327.             if (popserver->Flag_ExternalServer)
  3328.                 FPuts(mulder,"EXTERNALSERVER ");
  3329.  
  3330.             if (popserver->Flag_DeleteMails)
  3331.                 FPuts(mulder,"DELETEMAILS ");
  3332.  
  3333.             FPuts(mulder,"\n");
  3334.  
  3335.             sprintf(buffer,"INVALIDMAILSUBJECT=%s\n",popserver->InvalidMailSubject);
  3336.             FPuts(mulder,buffer);
  3337.  
  3338.             sprintf(buffer,"INVALIDADDRESS=%s\n",popserver->InvalidAddress);
  3339.             FPuts(mulder,buffer);
  3340.  
  3341.             sprintf(buffer,"INVALIDFILENAME=%s\n",popserver->InvalidFilename);
  3342.             FPuts(mulder,buffer);
  3343.  
  3344.             sprintf(buffer,"INBOUND=%s\n",popserver->InboundPath);
  3345.             FPuts(mulder,buffer);
  3346.  
  3347.             sprintf(buffer,"OUTBOUND=%s\n",popserver->OutboundPath);
  3348.             FPuts(mulder,buffer);
  3349.  
  3350.             FPuts(mulder,"END\n\n");
  3351.             popserver=popserver->ln_Succ;
  3352.         }
  3353.         Close(mulder);
  3354.     }
  3355. }
  3356.  
  3357.  
  3358. void mystrcpy(char *dest,char *src,ULONG length)
  3359. {
  3360.     ULONG counter=0;
  3361.     while (*src && (*src==' ' | *src==9 | isalnum(*src) ))
  3362.         src++;
  3363.  
  3364.     while (*src && (*src==' ' | *src=='=' | *src==':' | *src==9 ))
  3365.         src++;
  3366.     while (*src && *src!='\n' && *src!='\r' && counter<length)
  3367.     {
  3368.         *dest++=*src++;
  3369.         counter++;
  3370.     }
  3371.     if (counter>=length)
  3372.         *(dest-1)=0;
  3373.     else
  3374.         *dest=0;
  3375.  
  3376. }
  3377.  
  3378.  
  3379. void StartReminder()
  3380. {
  3381.     char error=FALSE;
  3382.     struct PortData *mport=(PortData *)MainTask->tc_UserData;
  3383.     char buffer[200];
  3384.     struct TagItem ProcTagList[] =
  3385.     {
  3386.         {    NP_Entry,        (ULONG)reminder_main},
  3387.         {    NP_Name,            (ULONG)"novia_reminder"},
  3388.         {    NP_StackSize,    20000},
  3389.         {    TAG_DONE,        TAG_DONE},
  3390.     };
  3391.     CreateNewProc(ProcTagList);
  3392. }
  3393.  
  3394. void reminder_main()
  3395. {
  3396.     char quit=FALSE;
  3397.     ULONG sigs=0;
  3398.     ULONG sb_reminder_eventport=NULL;
  3399.     ULONG    sb_timerport=NULL;
  3400.     char buffer[200];
  3401.     Event *event;
  3402.     char *reminder_eventportname="novia_reminder_control_port";
  3403.     struct MsgPort *timerport=CreateMsgPort();
  3404.     struct timerequest *timereq=NULL;
  3405.  
  3406.     reminder_eventport=CreateMsgPort();
  3407.     if (reminder_eventport && timerport)
  3408.     {
  3409.         sb_reminder_eventport=1<<reminder_eventport->mp_SigBit;
  3410.         sb_timerport=1<<timerport->mp_SigBit;
  3411.         reminder_eventport->mp_Node.ln_Name=reminder_eventportname;
  3412.         AddPort(reminder_eventport);
  3413.  
  3414.         if ((timereq=CreateIORequest(timerport,sizeof(EventRequest))))
  3415.         {
  3416.             if (OpenDevice("timer.device",UNIT_VBLANK,(IORequest *)timereq,0))
  3417.             {
  3418.                 printf("can't open timer.device.\nUnable to start Reminder.\n");
  3419.                 quit=TRUE;
  3420.             }
  3421.             else
  3422.             {
  3423.                 TimerBase = (struct Library *)timereq->tr_node.io_Device;
  3424.             }
  3425.         }
  3426.         else
  3427.             quit=TRUE;
  3428.     }
  3429.     else
  3430.         quit=TRUE;
  3431.  
  3432. //    GetTime(struct Date *date);
  3433.  
  3434.     if (!quit)
  3435.     {
  3436.         timereq->tr_time.tv_secs=5;
  3437.         timereq->tr_time.tv_micro=0;
  3438.         timereq->tr_node.io_Command=TR_ADDREQUEST;
  3439.         SendIO((IORequest *)timereq);
  3440.  
  3441.         GetTime(&actualdate);
  3442.  
  3443.         event=(Event *)mainportconfig->EventList.mlh_Head;
  3444.         while (event->ln_Succ)
  3445.         {
  3446.             if ((event->eventreq=CreateIORequest(timerport,sizeof(EventRequest))))
  3447.             {
  3448.                 ULONG datecode = 0;
  3449.                 event->eventreq->tr_node.io_Device  = timereq->tr_node.io_Device;
  3450.                 event->eventreq->tr_node.io_Unit    = timereq->tr_node.io_Unit;
  3451.                 event->eventreq->tr_node.io_Command = TR_ADDREQUEST;
  3452.                 event->eventreq->tr_time.tv_micro   = 0;
  3453.                 event->init=TRUE;
  3454.  
  3455.                 datecode = CalcEvent(event);
  3456.                 if (datecode)
  3457.                 {
  3458.                     if (event->NextEvent.datecode)
  3459.                         CopyMem(&event->NextEvent,&event->LastEvent,sizeof(Date));
  3460.                     event->NextEvent.datecode=datecode;
  3461.                     Datecode2Date(&event->NextEvent);
  3462.  
  3463.                     if (datecode > actualdate.datecode)
  3464.                     {
  3465.                         event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3466.                         SendIO((IORequest *)event->eventreq);
  3467.                         event->Running=TRUE;
  3468.                     }
  3469.                     else
  3470.                     {
  3471.                         CopyMem(&actualdate,&event->NextEvent,sizeof(Date));
  3472.                         datecode = CalcEvent(event);
  3473.                         if (datecode <= actualdate.datecode)
  3474.                         {
  3475.                             event->Running=FALSE;
  3476.                         }
  3477.                         else
  3478.                         {
  3479. //                            CopyMem(&actualdate,&event->LastEvent,sizeof(Date));
  3480.  
  3481.                             event->NextEvent.datecode = datecode;
  3482.                             Datecode2Date(&event->NextEvent);
  3483.  
  3484.                             ExecuteEvent(event);
  3485.  
  3486.                             event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3487.                             SendIO((IORequest *)event->eventreq);
  3488.                             event->Running=TRUE;
  3489.                         }
  3490.                     }
  3491.                 }
  3492.                 else
  3493.                 {
  3494.                 }
  3495.             }
  3496.             event=event->ln_Succ;
  3497.         }
  3498.         SendEventMsg(main_eventport,reminder_eventport, 0, GUIMSG_REDRAW_REMINDERLIST);
  3499.     }
  3500.     while (!quit)
  3501.     {
  3502.         sigs=Wait(sb_reminder_eventport|sb_timerport);
  3503.         if ((sb_reminder_eventport & sigs))
  3504.         {
  3505.             struct EventMessage *msg;
  3506.             while ((msg=(EventMessage *)GetMsg(reminder_eventport)))
  3507.             {
  3508.                 switch (msg->msg_type)
  3509.                 {
  3510.                     case EVENTMSGTYPE_QUIT:
  3511.                         quit=TRUE;
  3512.                         break;
  3513.                     case GUIMSG_REDRAW_REMINDERLIST:
  3514.                         break;
  3515.                 }
  3516.                 if (msg->msg.mn_ReplyPort!=reminder_eventport)
  3517.                     ReplyMsg((Message *)msg);
  3518.                 else
  3519.                 {
  3520.                     FreeVec((Message *)msg);
  3521.                 }
  3522.             }
  3523.         }
  3524.         if ((sb_timerport & sigs))
  3525.         {
  3526.             struct EventRequest *eventreq;
  3527.             while ((eventreq = (EventRequest *)GetMsg(timerport)))
  3528.             {
  3529.                 if (eventreq == (EventRequest *)timereq)
  3530.                 {
  3531.                     if (CheckIO((IORequest *)timereq))
  3532.                     {
  3533.                         WaitIO((IORequest *)timereq);
  3534.                         timereq->tr_time.tv_secs=5;
  3535.                         SendIO((IORequest *)timereq);
  3536.                         GetTime(&actualdate);
  3537.                         event=(Event *)mainportconfig->EventList.mlh_Head;
  3538.                         while (event->ln_Succ)
  3539.                         {
  3540.                             if (event->init==FALSE)
  3541.                             {
  3542.                                 if ((event->eventreq=CreateIORequest(timerport,sizeof(EventRequest))))
  3543.                                 {
  3544.                                     ULONG datecode = 0;
  3545.                                     event->eventreq->tr_node.io_Device  = timereq->tr_node.io_Device;
  3546.                                     event->eventreq->tr_node.io_Unit    = timereq->tr_node.io_Unit;
  3547.                                     event->eventreq->tr_node.io_Command = TR_ADDREQUEST;
  3548.                                     event->eventreq->tr_time.tv_micro   = 0;
  3549.                                     event->init=TRUE;
  3550.                                 }
  3551.                             }
  3552.                             if (event->Running==FALSE && event->init==TRUE)
  3553.                             {
  3554.                                 ULONG datecode;
  3555.                                 datecode = CalcEvent(event);
  3556.                                 if (datecode)
  3557.                                 {
  3558.                                     if (event->NextEvent.datecode)
  3559.                                         CopyMem(&event->NextEvent,&event->LastEvent,sizeof(Date));
  3560.                                     event->NextEvent.datecode=datecode;
  3561.                                     Datecode2Date(&event->NextEvent);
  3562.  
  3563.                                     if (datecode > actualdate.datecode)
  3564.                                     {
  3565.                                         event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3566.                                         SendIO((IORequest *)event->eventreq);
  3567.                                         event->Running=TRUE;
  3568.                                     }
  3569.                                     else
  3570.                                     {
  3571.                                         CopyMem(&actualdate,&event->NextEvent,sizeof(Date));
  3572.                                         datecode = CalcEvent(event);
  3573.                                         if (datecode <= actualdate.datecode)
  3574.                                             event->Running=FALSE;
  3575.                                         else
  3576.                                         {
  3577.                                             CopyMem(&actualdate,&event->LastEvent,sizeof(Date));
  3578.  
  3579.                                             event->NextEvent.datecode = datecode;
  3580.                                             Datecode2Date(&event->NextEvent);
  3581.  
  3582.                                             ExecuteEvent(event);
  3583.  
  3584.                                             event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3585.                                             SendIO((IORequest *)event->eventreq);
  3586.                                             event->Running=TRUE;
  3587.                                         }
  3588.                                     }
  3589.                                 }
  3590.                             }
  3591.                             event=event->ln_Succ;
  3592.                         }
  3593.                     }
  3594.                 }
  3595.                 else
  3596.                 {
  3597. /*
  3598.                     if ((event=eventreq->event))
  3599.                     {
  3600.                         AbortIO((IORequest *)eventreq);
  3601.                         if (CheckIO((IORequest *)eventreq))
  3602.                         {
  3603.                             GetTime(&actualdate);
  3604.                             CalcEvent(event);
  3605.                             if (event->NextEvent.datecode > actualdate.datecode)
  3606.                             {
  3607.                                 event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3608.                                 SendIO((IORequest *)event->eventreq);
  3609.                             }
  3610.                             SendEventMsg(main_eventport,reminder_eventport, 0, GUIMSG_REDRAW_REMINDERLIST);
  3611.                             ExecuteEvent(event);
  3612.                         }
  3613.                         else
  3614.                             printf("%s not on\n",event->Name);
  3615.                     }
  3616. */
  3617.  
  3618.  
  3619.                     event=(Event *)mainportconfig->EventList.mlh_Head;
  3620.                     while (event->ln_Succ)
  3621.                     {
  3622.                         if (event->eventreq && eventreq == event->eventreq)
  3623.                         {
  3624.                             if (CheckIO((IORequest *)event->eventreq))
  3625.                             {
  3626.                                 ULONG datecode;
  3627.  
  3628.                                 GetTime(&actualdate);
  3629.                                 datecode = CalcEvent(event);
  3630.                                 CopyMem(&event->NextEvent,&event->LastEvent,sizeof(Date));
  3631.                                 
  3632.                                 if (datecode)
  3633.                                 {
  3634.                                     if (datecode > actualdate.datecode)
  3635.                                     {
  3636.                                         event->NextEvent.datecode = datecode;
  3637.                                         Datecode2Date(&event->NextEvent);
  3638.  
  3639.                                         event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3640.                                         SendIO((IORequest *)event->eventreq);
  3641.                                         event->Running=TRUE;
  3642.                                     }
  3643.                                     else
  3644.                                     {
  3645.                                         CopyMem(&actualdate,&event->NextEvent,sizeof(Date));
  3646.                                         datecode = CalcEvent(event);
  3647.                                         if (datecode <= actualdate.datecode)
  3648.                                         {
  3649.                                             event->Running=FALSE;
  3650.                                         }
  3651.                                         else
  3652.                                         {
  3653.                                             event->NextEvent.datecode = datecode;
  3654.                                             Datecode2Date(&event->NextEvent);
  3655.                                             event->eventreq->tr_time.tv_secs = event->NextEvent.datecode - actualdate.datecode;
  3656.                                             SendIO((IORequest *)event->eventreq);
  3657.                                             event->Running=TRUE;
  3658.                                         }
  3659.                                     }
  3660.                                 }
  3661.  
  3662.                                 ExecuteEvent(event);
  3663.                                 SendEventMsg(main_eventport,reminder_eventport, 0, GUIMSG_REDRAW_REMINDERLIST);
  3664.                             }
  3665.                         }
  3666.                         event=event->ln_Succ;
  3667.                     }
  3668.  
  3669.                 }
  3670.             }
  3671.         }
  3672.     }
  3673.     AbortIO((IORequest *)timereq);
  3674.     WaitIO((IORequest *)timereq);
  3675.     event=(Event *)mainportconfig->EventList.mlh_Head;
  3676.     while (event->ln_Succ)
  3677.     {
  3678.         if (event->init)
  3679.         {
  3680.             event->init=FALSE;
  3681.             event->Running=FALSE;
  3682.             if (event->eventreq)
  3683.             {
  3684.                 AbortIO((IORequest *)event->eventreq);
  3685.                 WaitIO((IORequest *)event->eventreq);
  3686.             }
  3687.             if (event->eventreq)
  3688.                 DeleteIORequest((IORequest *)event->eventreq);
  3689.         }
  3690.         event=event->ln_Succ;
  3691.     }
  3692.  
  3693.     if (reminder_eventport)
  3694.     {
  3695.         if (FindPort(reminder_eventportname))
  3696.             RemPort(reminder_eventport);
  3697.         DeleteMsgPort(reminder_eventport);
  3698.         reminder_eventport=NULL;
  3699.     }
  3700.     if (timereq)
  3701.     {
  3702.         CloseDevice((IORequest *)timereq);
  3703.         DeleteIORequest((IORequest *)timereq);
  3704.     }
  3705.     if (timerport)
  3706.         DeleteMsgPort(timerport);
  3707. }
  3708.  
  3709. ULONG CalcEvent(Event *event)
  3710. {
  3711.     ULONG result = 0;
  3712.     struct Date *nextdate=&event->NextEvent;
  3713.     struct Date *lastdate=&event->LastEvent;
  3714.     struct Date *edate=&event->BeginDate;
  3715.  
  3716.     switch (event->DateType)
  3717.     {
  3718.         case DATETYPE_DATE:
  3719.  
  3720.             if (event->UseInterval==FALSE | (!nextdate->datecode))
  3721.             {
  3722.                 result=event->BeginDate.datecode;
  3723.             }
  3724.             else
  3725.             {
  3726.                 ULONG nexttime = nextdate->hours*3600 + nextdate->mins*60 + nextdate->secs + event->IntervalTime * event->Multiplicator;
  3727.                 ULONG    endtime = event->EndDate.hours*3600 + event->EndDate.mins*60 + event->EndDate.secs;
  3728.                 if (nexttime < endtime)
  3729.                     result = nextdate->datecode + event->IntervalTime * event->Multiplicator;
  3730.  
  3731.             }
  3732.             break;
  3733.  
  3734.         case DATETYPE_SPACE:
  3735.         
  3736.             if (event->UseInterval==FALSE | (!nextdate->datecode))
  3737.             {
  3738.                 UBYTE counter=0;
  3739.                 if (event->UseWeekday)
  3740.                 {
  3741.                     UBYTE weekday;
  3742.                     if (!nextdate->datecode)
  3743.                         weekday=event->BeginDate.weekday;
  3744.                     else
  3745.                         weekday=nextdate->weekday;
  3746.                     if (weekday<6)
  3747.                         weekday++;
  3748.                     else
  3749.                         weekday=0;                    
  3750.                     while (counter<7 && !event->weekday[weekday])
  3751.                     {
  3752.                         counter++;
  3753.                         if (weekday<6)
  3754.                             weekday++;
  3755.                         else
  3756.                             weekday=0;
  3757.                     }
  3758.                     if (counter==7)counter=0;
  3759.                 }
  3760.                 if (nextdate->datecode==0)
  3761.                     result=event->BeginDate.datecode + (counter * 86400);
  3762.                 else
  3763.                 {
  3764.                     if ((nextdate->datecode + 86400 + (counter * 86400))<= event->EndDate.datecode)
  3765.                         result = nextdate->datecode + ((counter + 1) * 86400);
  3766.                 }
  3767.             }
  3768.             else
  3769.             {
  3770.                 UBYTE counter=0;
  3771.                 ULONG nexttime=nextdate->hours*3600 + nextdate->mins*60 + nextdate->secs + event->IntervalTime * event->Multiplicator;
  3772.                 ULONG endtime=event->EndDate.hours*3600 + event->EndDate.mins*60 + event->EndDate.secs;
  3773.                 if (event->UseWeekday)
  3774.                 {
  3775.                     UBYTE weekday=nextdate->weekday;
  3776.                     if (weekday<6)
  3777.                         weekday++;
  3778.                     else
  3779.                         weekday=0;                    
  3780.                     while (counter<7 && !event->weekday[weekday])
  3781.                     {
  3782.                         counter++;
  3783.                         if (weekday<6)
  3784.                             weekday++;
  3785.                         else
  3786.                             weekday=0;
  3787.                     }
  3788.                     if (counter==7)counter=0;
  3789.                 }
  3790.                 if (nexttime <= endtime)
  3791.                 {
  3792.                     result = nextdate->datecode+event->IntervalTime * event->Multiplicator;
  3793.                 }
  3794.                 else
  3795.                 {
  3796.                     if (event->IntervalTime * event->Multiplicator <= 86400)
  3797.                     {
  3798.                         if ((nextdate->datecode + event->IntervalTime * event->Multiplicator + counter * 86400) < event->EndDate.datecode)
  3799.                         {
  3800.                             nexttime=86400-(nextdate->hours*3600 + nextdate->mins*60 + nextdate->secs);
  3801.                             result = nextdate->datecode + nexttime + (event->BeginDate.hours*3600 +event->BeginDate.mins*60+event->BeginDate.secs) + (counter * 86400);
  3802.                         }
  3803.                     }
  3804.                     else
  3805.                     {
  3806.                         if ((nextdate->datecode + event->IntervalTime * event->Multiplicator) < event->EndDate.datecode)
  3807.                         {
  3808.                             UBYTE counter=0;
  3809.                             if (event->UseWeekday)
  3810.                             {
  3811.                                 ULONG days = ((event->IntervalTime * event->Multiplicator)/86400) * 86400;
  3812.                                 ULONG restdays = days-(days/7)*7;
  3813.                                 ULONG weekday = nextdate->weekday;
  3814.  
  3815.                                 if (weekday+restdays<7)
  3816.                                     weekday=weekday+restdays;
  3817.                                 else
  3818.                                     weekday=weekday+restdays-7;
  3819.  
  3820.                                 weekday=nextdate->weekday;
  3821.                                 if (weekday<6)
  3822.                                     weekday++;
  3823.                                 else
  3824.                                     weekday=0;                    
  3825.  
  3826.                                 while (counter<7 && !event->weekday[weekday])
  3827.                                 {
  3828.                                     counter++;
  3829.                                     if (weekday<6)
  3830.                                         weekday++;
  3831.                                     else
  3832.                                         weekday=0;
  3833.                                 }
  3834.                                 if (counter==7)counter=0;
  3835.                             }
  3836.                             if ((nextdate->datecode + event->IntervalTime * event->Multiplicator + counter * 86400) <= event->EndDate.datecode)
  3837.                             {
  3838.                                 struct Date mydate;
  3839.                                 mydate.datecode=nextdate->datecode + event->IntervalTime * event->Multiplicator;
  3840.                                 Datecode2Date(&mydate);
  3841.                                 mydate.hours = event->BeginDate.hours;
  3842.                                 mydate.mins = event->BeginDate.mins;
  3843.                                 mydate.secs = event->BeginDate.secs;
  3844.                                 CalcDatecode(&mydate);
  3845.                                 result = mydate.datecode;
  3846.                             }
  3847.                         }
  3848.                     }
  3849.                 }
  3850.             }
  3851.             break;
  3852.         case DATETYPE_MONTH:
  3853.  
  3854.  
  3855.  
  3856.             break;
  3857.         case DATETYPE_DAILY:
  3858.             if (event->UseInterval==FALSE | (!nextdate->datecode))
  3859.             {
  3860.                 UBYTE counter=0;
  3861.                 if (event->UseWeekday)
  3862.                 {
  3863.                     UBYTE weekday=nextdate->weekday;
  3864.                     if (weekday<6)
  3865.                         weekday++;
  3866.                     else
  3867.                         weekday=0;
  3868.                             
  3869.                     while (counter<7 && !event->weekday[weekday])
  3870.                     {
  3871.                         counter++;
  3872.                         if (weekday<6)
  3873.                             weekday++;
  3874.                         else
  3875.                             weekday=0;
  3876.                     }
  3877.                     if (counter==7)counter=0;
  3878.                 }
  3879.                 if (nextdate->datecode==0)
  3880.                 {
  3881.                     struct Date mydate;
  3882.                     CopyMem(&actualdate,&mydate,sizeof(Date));
  3883.                     if (event->UseInterval==FALSE)
  3884.                     {
  3885.                         ULONG actualtime = actualdate.hours*3600 + actualdate.mins*60 + actualdate.secs;
  3886.                         ULONG begintime  = event->BeginDate.hours*3600 + event->BeginDate.mins*60 + event->BeginDate.secs;
  3887.                         if (actualtime>begintime | counter)
  3888.                             result = mydate.datecode + (86400-actualtime) + begintime + (counter*86400);
  3889.                     }
  3890.                     else
  3891.                     {
  3892.                         if (event->IntervalTime * event->Multiplicator <= 86400)
  3893.                         {
  3894.                             ULONG actualtime = actualdate.hours*3600 + actualdate.mins*60 + actualdate.secs;
  3895.                             ULONG endtime  = event->EndDate.hours*3600 + event->EndDate.mins*60 + event->EndDate.secs;
  3896.                             if (actualtime>endtime | counter)
  3897.                                 result = mydate.datecode + (86400-actualtime) + (event->BeginDate.hours*3600 + event->BeginDate.mins*60 + event->BeginDate.secs)  + (counter*86400);
  3898.                         }
  3899.                         else
  3900.                         {
  3901.                             UBYTE counter = 0;
  3902.                             if (event->UseWeekday)
  3903.                             {
  3904.                                 ULONG days     = ((event->IntervalTime * event->Multiplicator)/86400) * 86400;
  3905.                                 ULONG restdays = days-(days/7)*7;
  3906.                                 ULONG weekday  = nextdate->weekday;;
  3907.             
  3908.                                 if (weekday+restdays<7)
  3909.                                     weekday=weekday+restdays;
  3910.                                 else
  3911.                                     weekday=weekday+restdays-7;
  3912.             
  3913.                                 if (weekday<6)
  3914.                                     weekday++;
  3915.                                 else
  3916.                                     weekday=0;
  3917.                                         
  3918.                                 while (counter<7 && !event->weekday[weekday])
  3919.                                 {
  3920.                                     counter++;
  3921.                                     if (weekday<6)
  3922.                                         weekday++;
  3923.                                     else
  3924.                                         weekday=0;
  3925.                                 }
  3926.                                 if (counter==7)counter=0;
  3927.                             }
  3928.     
  3929.                             if ((mydate.datecode + event->IntervalTime * event->Multiplicator + counter * 86400) < event->EndDate.datecode)
  3930.                             {
  3931.                                 mydate.datecode = mydate.datecode + event->IntervalTime * event->Multiplicator + counter * 86400;
  3932.                                 Datecode2Date(&mydate);
  3933.                                 mydate.hours = event->BeginDate.hours;
  3934.                                 mydate.mins  = event->BeginDate.mins;
  3935.                                 mydate.secs  = event->BeginDate.secs;
  3936.                                 CalcDatecode(&mydate);
  3937.                                 result = mydate.datecode;
  3938.                             }
  3939.                         }
  3940.                     }
  3941.                 }
  3942.                 else
  3943.                     result = nextdate->datecode + 86400 + counter * 86400;
  3944.             }
  3945.             else
  3946.             {
  3947.                 ULONG nexttime=nextdate->hours*3600 + nextdate->mins*60 + nextdate->secs + event->IntervalTime * event->Multiplicator;
  3948.                 ULONG endtime=event->EndDate.hours*3600 + event->EndDate.mins*60 + event->EndDate.secs;
  3949.  
  3950.                 if (nexttime <= endtime)
  3951.                     result = nextdate->datecode+event->IntervalTime * event->Multiplicator;
  3952.                 else
  3953.                 {
  3954.                     UBYTE counter=0;
  3955.                     if (event->UseWeekday)
  3956.                     {
  3957.                         UBYTE weekday;
  3958.                         if (!nextdate->datecode)
  3959.                             weekday=event->BeginDate.weekday;
  3960.                         else
  3961.                             weekday=nextdate->weekday;
  3962.                         if (weekday<6)
  3963.                             weekday++;
  3964.                         else
  3965.                             weekday=0;                    
  3966.                         while (counter<7 && !event->weekday[weekday])
  3967.                         {
  3968.                             counter++;
  3969.                             if (weekday<6)
  3970.                                 weekday++;
  3971.                             else
  3972.                                 weekday=0;
  3973.                         }
  3974.                         if (counter==7)counter=0;
  3975.                     }
  3976.                     result = nextdate->datecode + (86400 - (nexttime - event->IntervalTime * event->Multiplicator)) + (event->BeginDate.hours*3600 + event->BeginDate.mins*60 + event->BeginDate.secs) + counter*86400;
  3977.                 }
  3978.             }
  3979.             break;
  3980.     }
  3981.     return result;
  3982. }
  3983.  
  3984. void ExecuteEvent(Event *event)
  3985. {
  3986. //    printf("Execute event: %s next: %d last: %d actual: %d\n",event->Name,event->NextEvent.datecode,event->LastEvent.datecode,actualdate.datecode);
  3987. }
  3988.  
  3989. void SendOnlineMessage(PortData *cport)
  3990. {
  3991.     char buffer[200];
  3992.     ULONG        touser    = 0;
  3993.     PortData *toport    = NULL;
  3994.     BOOL        broadcast= FALSE;
  3995.     if (!strlen(cport->argstring[1]))
  3996.     {
  3997.         ioprintf("Port#, or UserHandle (* = BROADCAST MESSAGE): ");
  3998.         Getstring(buffer,0,50,0,0);
  3999.         if (strlen(buffer))
  4000.         {
  4001.             StrToLong(buffer,(LONG *)&touser);
  4002.             if (touser)
  4003.                 toport = FindClient(touser);
  4004.             else
  4005.             {
  4006.                 if ((touser = FindUser(buffer)))
  4007.                     toport = FindClientByUser(touser);
  4008.                 else
  4009.                     if (*buffer = '*')
  4010.                         broadcast = TRUE;
  4011.             }
  4012.         }
  4013.     }
  4014.     else
  4015.     {
  4016.         StrToLong(cport->argstring[1],(LONG *)&touser);
  4017.         if (touser)
  4018.             toport = FindClient(touser);
  4019.         else
  4020.         {
  4021.             if ((touser = FindUser(cport->argstring[1])))
  4022.                 toport = FindClientByUser(touser);
  4023.             else
  4024.                 if (*cport->argstring[1] = '*')
  4025.                     broadcast = TRUE;
  4026.         }
  4027.     }
  4028.     if (toport)
  4029.     {
  4030.         ioprintf("enter your msg:");
  4031.         Getstring(buffer,0,50,0,0);
  4032.         if (strlen(buffer))
  4033.         {
  4034.             struct OnLineMessage *olm;
  4035.             if ((olm = AllocVec(sizeof(OnLineMessage)+strlen(buffer)+1,MEMF_ANY|MEMF_CLEAR)))
  4036.             {
  4037.                 olm->data_len    = strlen(buffer);
  4038.                 olm->OLM_type    = OLM_TYPE_NORMAL;
  4039.                 olm->ToUser        = touser;
  4040.                 olm->FromUser  = cport->LocalUser.IDNumber;
  4041.                 strcpy(olm->data, buffer);
  4042.                 SendMsg(toport->LocalPort,olm,sizeof(OnLineMessage)+strlen(buffer)+1,MSG_COMMAND,CMD_OLM);
  4043.                 ioprintf("Message sended.\n");
  4044.             }
  4045.             else
  4046.                 ioprintf("can't send message, out of memory.\n");
  4047.         }
  4048.     }
  4049.     else
  4050.     {
  4051.         if (broadcast)
  4052.         {
  4053.             ioprintf("enter your msg:");
  4054.             Getstring(buffer,0,50,0,0);
  4055.             if (strlen(buffer))
  4056.             {
  4057.                 struct OnLineMessage *olm;
  4058.                 struct PortData2 *clientport = (PortData2 *)client_list->lh_Head;
  4059.                 while (clientport->port_node.ln_Succ)
  4060.                 {
  4061.                     if (!clientport->port_address->ProgramClose && clientport->port_address->network.online)
  4062.                     {
  4063.                         if ((olm = AllocVec(sizeof(OnLineMessage)+strlen(buffer)+1,MEMF_ANY|MEMF_CLEAR)))
  4064.                         {
  4065.                             olm->data_len    = strlen(buffer);
  4066.                             olm->OLM_type    = OLM_TYPE_BROADCAST;
  4067.                             olm->ToUser        = touser;
  4068.                             strcpy(olm->data, buffer);
  4069.                             SendMsg(clientport->port_address->LocalPort,olm,sizeof(OnLineMessage)+strlen(buffer)+1,MSG_COMMAND,CMD_OLM);
  4070.                             ioprintf("Message sended.\n");
  4071.                         }
  4072.                         else
  4073.                             ioprintf("can't send message, out of memory.\n");
  4074.                     }
  4075.                     clientport=(PortData2 *)clientport->port_node.ln_Succ;
  4076.                 }
  4077.             }
  4078.         }
  4079.     }
  4080. }
  4081.  
  4082.  
  4083. PortData *FindClient( ULONG PortID)
  4084. {
  4085.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  4086.     struct PortData2 *nc=(PortData2 *)client_list->lh_Head;
  4087.     if (PortID>=0)
  4088.     {
  4089.         while (nc->port_node.ln_Succ)
  4090.         {
  4091.             if (nc->port_address->clientconfig.IDNumber==PortID)
  4092.                 return nc->port_address;
  4093.             nc=(PortData2 *)nc->port_node.ln_Succ;
  4094.         }
  4095.     }
  4096.     return 0;        
  4097. }
  4098.  
  4099. PortData *FindClientByUser( ULONG UserID)
  4100. {
  4101.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  4102.     struct PortData2 *nc=(PortData2 *)client_list->lh_Head;
  4103.     ioprintf("findClientByUser: %d\n",UserID);
  4104.     if (UserID)
  4105.     {
  4106.         while (nc->port_node.ln_Succ)
  4107.         {
  4108.             if (nc->port_address->LocalUser.IDNumber == UserID)
  4109.                 return nc->port_address;
  4110.             nc=(PortData2 *)nc->port_node.ln_Succ;
  4111.         }
  4112.     }
  4113.     return 0;        
  4114. }
  4115.  
  4116. void Writechar(char i)
  4117. {
  4118.     char *p;
  4119.     *p = i;
  4120.     Writeio(p, 1);
  4121. }
  4122.  
  4123. void CR()
  4124. {
  4125.     char *p="EA";
  4126.     Writeio(p,-1);
  4127. }
  4128.  
  4129.